pthread_barrier_wait在创建所有线程后挂起

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pthread_barrier_wait在创建所有线程后挂起相关的知识,希望对你有一定的参考价值。

我正在尝试编写一个简单的程序,在从main打印消息之前使用屏障等待创建多个线程。

这是我的代码:

#include <iostream>
#include <pthread.h>
#include <stdio.h>
#include <cstdlib>
#include <cstdint>

#define NUM_THREADS 8

pthread_barrier_t barrier;

void *threadFun(void *tid)
{
    intptr_t temp = (intptr_t) tid;
    printf("Hello from thread %d
", temp);
}

int main()
{
    pthread_t threads[NUM_THREADS];
    int rc;
    pthread_barrier_init(&barrier, NULL, NUM_THREADS);

    for(int i = 0; i < NUM_THREADS; ++i) {
        rc = pthread_create(&threads[i], NULL, threadFun, (void *) i);
        if(rc)  {
            printf("Error creating thread %d
", i);
            exit(-1);
        }
    }

    pthread_barrier_wait(&barrier);
    printf("Hello from main!
");

    for(int i = 0; i < NUM_THREADS; ++i) {
        pthread_join(threads[i], NULL);
    }
    pthread_barrier_destroy(&barrier);

    return 0;
}

目前,我的程序打印了一些非确定性的“Hello from thread”语句,并在打印“Hello from main!”之前挂起;但是,它总是打印8个线程消息。因此,创建了所有线程。

为什么还挂着?

答案

屏障期望在NUM_THREADS次上进行waited,但只有一个主线程实际调用pthread_barrier_wait

如果要将main与工作线程同步,则需要初始化NUM_WORKER_THREADS + 1的屏障。

以上是关于pthread_barrier_wait在创建所有线程后挂起的主要内容,如果未能解决你的问题,请参考以下文章

一旦 pthread_barrier_wait 返回,障碍如何被销毁?

如何在不等待 pthread_barrier_wait() 的情况下执行 pthread_barrier_destroy()

可以在所有容器组件中导入所有动作创建者吗?

在创建新折线之前从地图上删除所有折线

在指定路径创建所有目录

如何在 WIX 中为所有用户创建桌面快捷方式