在Pthread中将For循环的索引作为参数

时间:2018-12-03 23:29:45

标签: c multithreading pthreads

我有与此问题here相同的问题。但是,我使用的是C,而不是C ++,因此无法遵循公认的解决方案。我已经尝试使用第二种解决方案,但是那也不起作用。有什么方法可以传递循环变量的值,而不是C中的变量本身?

1 个答案:

答案 0 :(得分:0)

与您所链接的问题相对应的c稍微多一些。

为了防止出现竞争情况(我们正在与递增i的主线程竞争),我们不能简单地做到:

pthread_create(&p[i],NULL,somefunc,(void *) &i);

因此,我们需要做new,但是要做c。因此,我们使用malloc(线程函数应该执行free):

#include <pthread.h>
#include <stdlib.h>

void *
somefunc(void *ptr)
{
    int id = *(int*) ptr;

    // main thread _could_ free this after pthread_join, but it would need to
    // remember it -- easier to do it here
    free(ptr);

    // do stuff ...

    return (void *) 0;
}

int
main(void)
{
    int count = 10;
    pthread_t p[count];

    for (int i = 0; i < count; i++) {
        int *ptr = malloc(sizeof(int));
        *ptr = i;
        pthread_create(&p[i],NULL,somefunc,ptr);
    }

    for (int i = 0; i < count; i++)
        pthread_join(p[i],NULL);

    return 0;
}