如何确保在同一函数终止之前在函数中创建的所有线程都返回?

请考虑 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联接。
有没有通用的方法可以对函数说“嘿,不要返回”直到您创建的所有线程都返回“?

zm16603148 回答:如何确保在同一函数终止之前在函数中创建的所有线程都返回?

至少还有另外两种方式:

  1. 使用pthread 障碍。名称障碍的使用与您在谈论并发时通常听到的含义完全不同。在这里,它是一个同步原语,它使一组线程中的每一个线程(在其上的等待者)都阻塞,直到所有线程都到达为止,然后将它们全部取消阻塞。您首先要在某个共享位置用n+1作为计数来初始化屏障,然后在完成之前让函数本身及其创建的所有n线程都调用pthread_barrier_wait。假设您以这种方式执行此操作,则从等待返回后,n线程将无法再访问共享状态。他们需要立即返回。

  2. 使用condvar和互斥锁创建相同的事物(或其简化版本)。受互斥量保护,有多少n个线程仍在工作。创建它们的函数可以执行以下操作:

    pthread_mutex_lock(&cnt_mtx);
    while (count > 0) pthread_cond_wait(&cnt_cv,&cnt_mtx);
    pthread_mutex_unlock(&cnt_mtx);
    

不过,通常,我会在这里使用pthread_join。那就是它的目的。

本文链接:https://www.f2er.com/3127445.html

大家都在问