c++ - 使用 pthread 唤醒多线程的最佳方法

标签 c++ multithreading pthreads

我已经通过pthread_create创建了4个线程。我希望它们同时开始运行,因此我在线程过程的最开始添加 sem_wait(&sem) 。在主线程中,我可能会使用类似的东西,但我认为这不是一个好的解决方案:

for (int i = 0; i < 4; i++)
{
    sem_post(&sem);
}

我用谷歌搜索并找到了pthread_cond_t。但是,pthread_cond_broadcast只能唤醒当前正在等待的线程。即使我将 pthread_cond_wait 放在过程的最开始,仍然不能保证 pthread_cond_waitpthread_cond_broadcast 之前调用(在主线程中) .

为了避免这种情况,我必须添加大量额外的代码来确保waitbroadcast的调用顺序,这也不太聪明。

那么,有没有一种简单的方法来“排列”所有线程(使它们同时开始运行)?

似乎有一个sem_post_multiple,但它是pthread中的win32扩展。不过,我使用的是 Linux (Android)。

最佳答案

您正在寻找障碍

pthread_barrier_t

使用线程数 (n) 对其进行初始化,然后对每个线程调用 pthread_barrier_wait()。此调用将阻塞执行,直到 n 个线程到达屏障。

示例:

int num_threads = 4;
pthread_barrier_t bar;

void* thread_start(void* arg) {
    pthread_barrier_wait(&bar);
    //...
}
int main() {
    pthread_barrier_init(&bar,NULL,num_threads);
    pthread_t thread[num_threads];
    for (int i=0; i < num_threads; i++) {
        pthread_create(thread + i, NULL, &thread_start, NULL);
    }
    for (int i=0; i < num_threads; i++) {
        pthread_join(thread[i], NULL);
    }
    pthread_barrier_destroy(&bar);
    return 0;
}

关于c++ - 使用 pthread 唤醒多线程的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40126442/

相关文章:

c++ - 如何从 const char * 类型字符串中删除换行符

c++ - 为什么 GCC 不给我一个错误

android - 触摸屏幕时移动 View

c++ - 并行插入排序、幼稚尝试、使用 pthread 尝试失败、线程未并行排序,但与串行一起工作正常

c - 使用多线程的套接字服务器或文件服务器实现 : concept not clear

C++ traits类检测成员函数: compiler error in MSVC 2015 RC

c++ - 创建 C++ 程序时符号加载(源信息剥离)错误

c++ - SWIG C++ Python 多态和多线程

java - 如果我的值存储在线程安全映射中,该值是否需要是 ThreadLocal?

c - 线程无法识别标志中的更改