考虑C函数的以下部分:
for (int i = 0; i < n; ++i) {
thread_arg *arg = (thread_arg *) malloc(sizeof(thread_arg));
arg->random_value = random_value;
arg->message = &(message[i * 10]);
if (pthread_create(NULL, NULL, thread_start, (void *) &arg)) {
perror("pthread_create");
exit(EXIT_FAILURE);
}
}
在此for
循环中,我创建了n
所有线程,它们都使用不同的参数执行一个通用例程。该for
循环是一个较大函数的一部分,该函数返回一个数据结构,该结构将被所有并行线程修改。因此,重要的是,不要在所有线程完成之前返回此更大的函数。
我希望找到一种更简单的方法,然后为所有这些线程提供一个单独的ID,然后再与加入pthread_join
。
有什么通用的方法可以对函数说“嘿,在您创建的所有线程都返回之前不要返回”?
至少还有另外两种方式:
使用pthread屏障。名称障碍的用法与谈论并发时通常听到的含义完全不同。在这里,它是一个同步原语,它使一组线程中的每个线程(线程在其上等待)阻塞,直到所有线程都到达为止,然后将它们全部取消阻塞。首先,您需要在某个共享位置使用n+1
计数初始化屏障,然后在完成之前让函数本身及其n
创建的所有线程都调用pthread_barrier_wait
。假设您这样做,从等待中返回后,n
线程将无法再访问共享状态。他们需要立即返回。
使用condvar和互斥锁创建相同的事物(或其简化版本)。受互斥量保护,有多少n
线程仍在工作。然后,创建它们的函数可以执行以下操作:
pthread_mutex_lock(&cnt_mtx);
while (count > 0) pthread_cond_wait(&cnt_cv, &cnt_mtx);
pthread_mutex_unlock(&cnt_mtx);
通常,尽管如此,我会pthread_join
在这里使用。这就是它的目的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句