我正在使用 glibc pthreads 库编写一个多线程应用程序。我有 3 个 pthreads - 其中一个称为“调度程序”,另外两个称为“工人”和主线程。主线程监听事件并将它们放入队列中。然后调度程序线程将它们分派到工作队列。工作线程从工作队列中获取事件并执行。问题是有时,事件必须在主线程本身中执行,以防止主要的数据竞争。所以我需要一种机制来在收到特殊事件时暂停主线程并等待所有工作人员完成工作,然后执行此事件。
为了做到这一点,我使用了一个受互斥体保护的整数,其位由工作线程设置和重置。当工作人员在其队列中找不到作业时,它将其位设置为 0。如果有作业,则将其位标记为 1。想法是,如果其中一个工作人员正在运行,则整数为 != 0. 主线程现在,当它想要暂停自己以等待工作人员完成时,现在将进行条件等待,直到整数变为 0。工作线程在重置其位时将检查整数是否变为 0。如果为真,则它将向主线程发出信号。在这一点上,我希望所有的工作人员在他们的队列中都没有工作,所以主线程可以执行特殊事件。由于主线程负责将事件排队到第一个队列,我们保证没有事件会潜入工作人员。
伪代码如下。
int pause_threads() => the one called from main thread.
{
pthread_mutex_lock(pause_thread_lock));
while (pthread_states != 0) {
pthread_cond_wait(pause_mthread_cond), pause_thread_lock));
}
}
int thread_resume() => called after the special event is executed by main thread.
{
pthread_mutex_unlock(pause_thread_lock));
}
int thread_set_state_wait(index) => index is id 0,1 for each worker
{
pthread_mutex_lock(pause_thread_lock));
(thread_states) &= (~(MTHREAD_THR_STATE_RUNNING << index));
if (pthread_states == 0)
pthread_cond_signal(pause_thread_cond));
pthread_mutex_unlock(&(pause_thread_lock));
}
int thread_set_state_running(index)
{
pthread_mutex_lock(pause_thread_lock));
(pthread_states) |= (MTHREAD_THR_STATE_RUNNING << index);
pthread_mutex_unlock(pause_thread_lock));
}
我面临的问题是这段代码并不总是有效。有时,我看到当主线程正在执行特殊事件时,工作线程仍然处于活动状态并正在执行作业。逻辑有什么问题吗?有没有其他可能的方法来实现这一目标?我已尽力寻找解决方案。请帮忙。