有没有办法确保在转移到其他指令之前创建了一个线程(不使用诸如sleep()
之类的绕道)?
我有一个看起来像这样的循环:
for(i = 0; i < NUM_THREADS; ++i)
{
if(pthread_create(&threads_id_array[i], NULL, ThreadFunction, &args))
{
perror("pthread_create() error");
exit(1);
}
args.base += args.offset;
}
其中base
是指向数组的指针。我想确保在base
升级之前创建了一个线程,以便我可以确保线程的args.base
保持正确的值。目前,这会导致错误。
答案 0 :(得分:0)
如果您这样做是为了加快一些CPU限制工作,请考虑使用OpenMP而不是pthreads。
像这样:
#pragma omp parallel for
for(i = 0; i < NUM_THREADS; i++)
{
auto threadArgs = args;
threadArgs.base += i * threadArgs.offset;
ThreadFunction( &threadArgs );
}
答案 1 :(得分:0)
除了@Soonts的答案和@Martin James评论之外,这里还有另一个选项的片段 - 即使用结构数组,并为每个线程发送相应的索引:
char *base_ptr = base;
args_t args_array[NUM_THREADS];
for(i = 0; i < NUM_THREADS; ++i)
{
args_array[i].base = base_ptr;
base_ptr += args_array[i].offset;
}
for(i = 0; i < NUM_THREADS; ++i)
{
if(pthread_create(&threads_id_array[i], NULL, ThreadFunction, &args_array[i]))
{
perror("pthread_create() error");
exit(1);
}
}