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

拉维尔

考虑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
有什么通用的方法可以对函数说“嘿,在您创建的所有线程都返回之前不要返回”?

R .. GitHub停止帮助ICE

至少还有另外两种方式:

  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在这里使用这就是它的目的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

函数评估要求所有线程都运行-MVC

来自分类Dev

如何确保在函数返回之前执行所有行

来自分类Dev

如何确保在主线程停止之前所有线程都已停止?

来自分类Dev

virtual List <T>:“函数评估要求所有线程都运行”

来自分类Dev

如何确保查询发生在同一函数中的另一个查询之前?

来自分类Dev

如何等待方法中创建的所有线程

来自分类Dev

如何创建多个json数组并在同一函数中传递所有数组

来自分类Dev

从Java方法返回完成所有线程之前

来自分类Dev

如何理解“扭曲中的所有线程同时执行同一条指令”。在GPU中?

来自分类Dev

在终止时杀死所有线程

来自分类Dev

是否假定C / C ++中的所有函数都返回?

来自分类Dev

jQuery 确保一个函数在所有其他函数之前运行的最佳方法

来自分类Dev

从所有线程可见的对象构造函数中设置的对象状态吗?

来自分类Dev

返回时如何退出所有线程

来自分类Dev

线程创建。我用最后一个线程覆盖了所有线程

来自分类Dev

即使使用executor.awaitTermination,方法也会在执行所有线程之前返回

来自分类Dev

当所有线程未终止时,Valgrind输出

来自分类Dev

请问Spring Integrations Task Scheduler Block是否在Task Executor中的所有线程都忙

来自分类Dev

为什么不是所有线程都完成了?

来自分类Dev

所有线程都锁定在wait()状态

来自分类Dev

为什么所有线程都获得锁?

来自分类Dev

如何在同一函数中浏览来自2个不同MQQueue的所有消息?

来自分类Dev

如何在同一函数中浏览来自2个不同MQQueue的所有消息?

来自分类Dev

我在同一进程中创建的所有其他线程死亡后停止线程

来自分类Dev

Jmeter:如何一次初始化映射并为线程组中的所有线程共享它

来自分类Dev

如何立即杀死所有线程

来自分类Dev

所有线程是否真的同时运行同一程序?

来自分类Dev

如何阻塞新线程,直到创建并启动所有线程

来自分类Dev

如何安全地关闭退出之前的所有线程

Related 相关文章

  1. 1

    函数评估要求所有线程都运行-MVC

  2. 2

    如何确保在函数返回之前执行所有行

  3. 3

    如何确保在主线程停止之前所有线程都已停止?

  4. 4

    virtual List <T>:“函数评估要求所有线程都运行”

  5. 5

    如何确保查询发生在同一函数中的另一个查询之前?

  6. 6

    如何等待方法中创建的所有线程

  7. 7

    如何创建多个json数组并在同一函数中传递所有数组

  8. 8

    从Java方法返回完成所有线程之前

  9. 9

    如何理解“扭曲中的所有线程同时执行同一条指令”。在GPU中?

  10. 10

    在终止时杀死所有线程

  11. 11

    是否假定C / C ++中的所有函数都返回?

  12. 12

    jQuery 确保一个函数在所有其他函数之前运行的最佳方法

  13. 13

    从所有线程可见的对象构造函数中设置的对象状态吗?

  14. 14

    返回时如何退出所有线程

  15. 15

    线程创建。我用最后一个线程覆盖了所有线程

  16. 16

    即使使用executor.awaitTermination,方法也会在执行所有线程之前返回

  17. 17

    当所有线程未终止时,Valgrind输出

  18. 18

    请问Spring Integrations Task Scheduler Block是否在Task Executor中的所有线程都忙

  19. 19

    为什么不是所有线程都完成了?

  20. 20

    所有线程都锁定在wait()状态

  21. 21

    为什么所有线程都获得锁?

  22. 22

    如何在同一函数中浏览来自2个不同MQQueue的所有消息?

  23. 23

    如何在同一函数中浏览来自2个不同MQQueue的所有消息?

  24. 24

    我在同一进程中创建的所有其他线程死亡后停止线程

  25. 25

    Jmeter:如何一次初始化映射并为线程组中的所有线程共享它

  26. 26

    如何立即杀死所有线程

  27. 27

    所有线程是否真的同时运行同一程序?

  28. 28

    如何阻塞新线程,直到创建并启动所有线程

  29. 29

    如何安全地关闭退出之前的所有线程

热门标签

归档