gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:54:05 26 4
gpt4 key购买 nike

考虑 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。这就是它的目的。

    关于c - 如何确保在同一函数终止之前,在函数中创建的所有线程都返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58793271/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com