【问题标题】:Best way to wakeup multiple thread using pthread使用 pthread 唤醒多线程的最佳方法
【发布时间】:2016-10-19 08:49:21
【问题描述】:

我已经通过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)。

【问题讨论】:

    标签: c++ multithreading pthreads


    【解决方案1】:

    你正在寻找障碍

    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;
    }
    

    【讨论】:

    • 谢谢。这正是我想要的。 Android NDK不支持pthread_barrier_t,但是可以按照这个简化版来实现:simplified pthread_barrier_t
    • 大部分同步结构可以用其他工具构建,基本上你只需要互斥锁和cond.-variables
    猜你喜欢
    • 2018-10-13
    • 2014-05-15
    • 2013-06-04
    • 2022-11-03
    • 2011-08-01
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多