【问题标题】:C pthread synchronize functionC pthread同步函数
【发布时间】:2012-10-16 04:20:47
【问题描述】:

pthread 库中是否有同步线程的函数?不是互斥锁,不是信号量,只有一个调用函数。它应该锁定进入该点的线程,直到所有线程都达到这样的功能。例如:

function thread_worker(){
    //hard working

    syncThreads();
    printf("all threads are sync\n");
}

所以 printf 只有在所有线程结束工作时才被调用。

【问题讨论】:

    标签: c synchronization pthreads


    【解决方案1】:

    这样做的正确方法是使用障碍pthread 支持使用 pthread_barrier_t 的屏障。您使用需要同步的线程数对其进行初始化,然后您只需使用pthread_barrier_wait 使这些线程同步。

    例子:

    pthread_barrier_t barr;
    
    void thread_worker() {
        // do work
        // now make all the threads sync up
        int res = pthread_barrier_wait(&barr);
        if(res == PTHREAD_BARRIER_SERIAL_THREAD) {
            // this is the unique "serial thread"; you can e.g. combine some results here
        } else if(res != 0) {
            // error occurred
        } else {
            // non-serial thread released
        }
    }
    
    
    int main() {
        int nthreads = 5;
        pthread_barrier_init(&barr, NULL, nthreads);
    
        int i;
        for(i=0; i<nthreads; i++) {
            // create threads
        }
    }
    

    【讨论】:

    • 可以重复使用同一个屏障吗?我的线程中需要两个同步点
    • 是的。只要需要同步的线程数不变,就可以重用屏障。
    • 是的,它总是一样的......我必须再次破坏并创建屏障吗?
    • 就像我说的,你可以重复使用屏障。来自man pthread_barrier_wait: '[当pthread_barrier_wait 返回时],屏障应重置为最近引用它的 pthread_barrier_init() 函数所导致的状态。'
    猜你喜欢
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    相关资源
    最近更新 更多