Pthread唤醒一些线程的最佳方法

时间:2018-05-03 03:24:29

标签: c multithreading pthreads conditional-statements mutex

我想知道用循环一次唤醒多个线程的最佳方法是什么 我想过使用pthread_cond但是我不需要互斥锁,因为我不等待资源

Theres&n;线程:

start of thread
loop
action
wait
end of loop

然后主线程将会注意到它们开始工作。 每个线程使用带有互斥锁的pthread cond是否更好?或者每次完成任务时重新创建线程会更好吗?

1 个答案:

答案 0 :(得分:2)

您确实可以使用条件变量。它的工作方式是你的条件超过主线程设置的一些共享变量,以指示工作线程应该继续。你需要一个互斥锁,因为你有一个共享资源 - 主线程设置的共享变量和工作线程读取的。

类似的东西:

/* shared variables */
int run_iteration = -1;
pthread_mutex_t iteration_lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t iteration_cond = PTHREAD_COND_INITIALIZER;

工作线程:

int current_iteration = 0;

while (... )
{
    /* Wait for main to signal start of current_iteration */
    pthread_mutex_lock(&iteration_lock);
    while (run_iteration < current_iteration)
        pthread_cond_wait(&iteration_cond, &iteration_lock);
    pthread_mutex_unlock(&iteration_lock);

    /* ... Execute current_iteration ... */

    current_iteration++;
}

主线程:

/* signal start of next iteration */
pthread_mutex_lock(&iteration_lock);
run_iteration++;
pthread_cond_broadcast(&iteration_cond);
pthread_mutex_unlock(&iteration_lock);

或者,如果您需要线程以锁步方式运行,则可以使用pthread屏障(pthread_barrier_t)代替。