c - Pthread 唤醒多个线程的最佳方式

标签 c multithreading pthreads conditional-statements mutex

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

有 n 个线程:

start of thread
loop
action
wait
end of loop

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

最佳答案

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

类似于:

/* 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)。

关于c - Pthread 唤醒多个线程的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50146456/

相关文章:

c - 在指针递增时没有得到预期的结果

c - 从键盘获取字符(内存分配)

c - 通过函数传递指针

android - 交叉编译到arm时找不到lpthread

c - 执行 ls | c 程序中的 wc linux 命令使用 2 个进程通过管道进行通信

c++ - 在新线程中调用 OpenCV 函数 Canny() 会导致段错误

java - Lock.java 和 LockSupport.java : what purpose we have LockSupport?

android - 实时示例和 AIDL 在 android 中的使用?

c - 为什么 makecontext 不适用于 pthreads

c - 如何使用线程来提高代码的时间复杂度?