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