gpt4 book ai didi

c - 什么是干净/可靠地关闭使用 pthread 屏障进行同步的线程的好策略?

转载 作者:太空狗 更新时间:2023-10-29 16:11:54 25 4
gpt4 key购买 nike

我有一个基于 pthread 的多线程程序,它有四个线程无限期地执行这个运行循环(伪代码):

while(keepRunning)
{
pthread_barrier_wait(&g_stage_one_barrier);

UpdateThisThreadsStateVariables();

pthread_barrier_wait(&g_stage_two_barrier);

DoComputationsThatReadFromAllThreadsStateVariables();
}

这非常有效,因为在第一阶段每个线程都会更新自己的状态变量,这没关系,因为在第一阶段没有其他线程正在读取任何其他线程的状态变量。然后在第二阶段,就线程读取彼此的状态而言,这是一个混战,但这没关系,因为在第二阶段没有线程修改其本地状态变量,因此它们实际上是只读的。

我唯一剩下的问题是,当我的应用程序需要退出时,我如何干净可靠地关闭这些线程? (我所说的“干净可靠”是指不引入潜在的死锁或竞争条件,理想情况下无需发送任何 UNIX 信号来强制线程退出 pthread_barrier_wait() 调用)

我的 main() 线程当然可以为每个线程将 keepRunning 设置为 false,但是它如何让 pthread_barrier_wait() 为每个线程返回? AFAICT 让 pthread_barrier_wait() 返回的唯一方法是让所有四个线程的执行位置同时在 pthread_barrier_wait() 中,但是当某些线程可能已经退出时,这很难做到。

调用 pthread_barrier_destroy() 似乎是我想要做的,但是当任何线程可能正在等待屏障时调用 pthread_barrier_destroy() 是未定义的行为。

这个问题是否有众所周知的解决方案?

最佳答案

有两个标志并使用类似下面的东西应该可以工作:

for (;;)
{
pthread_barrier_wait(&g_stage_one_barrier); +
|
UpdateThisThreadsStateVariables(); |
|
pthread_mutex_lock(&shutdownMtx); | Zone 1
pendingShutdown = !keepRunning; |
pthread_mutex_unlock(&shutdownMtx); |
|
pthread_barrier_wait(&g_stage_two_barrier); +
|
if (pendingShutdown) |
break; | Zone 2
|
DoComputationsThatReadFromAllThreadsStateVariables(); |
}

shutdownMtx 也应该保护 keepRunning 的设置,尽管它没有显示。

逻辑是,当 pendingShutdown 设置为 true 时,所有线程都必须在 Zone 1 内。 (即使只有一些线程看到 keepRunningfalse 也是如此,因此在 keepRunning 上的比赛应该没问题。)都会到达pthread_barrier_wait(&g_stage_two_barrier),然后在进入Zone 2时全部爆发。

还可以检查 PTHREAD_BARRIER_SERIAL_THREAD——它由 pthread_barrier_wait() 返回,只针对其中一个线程——并且只进行锁定和更新该线程中的 pendingShutdown,这可以提高性能。

关于c - 什么是干净/可靠地关闭使用 pthread 屏障进行同步的线程的好策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28843735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com