我对 C 中的多线程还很陌生。我编写了一个简单的程序,它执行以下操作:
main 函数启动多个线程,每个线程等待使用条件变量设置标志
start
。之后,主函数启动另一个设置标志的线程,并通过 pthread_cond_broadcast()
通知所有线程该标志已设置。
start_routine
正在等待设置标志的线程(此处称为工作线程):
void* workerThread()
{
pthread_mutex_lock(&start_flag_mutex);
while(!start_flag)
{
pthread_cond_wait(&start_flag_condition, &start_flag_mutex);
}
pthread_mutex_unlock(&start_flag_mutex);
//Do some work here...
}
广播更改的线程的start_routine
:
void* starterThread()
{
pthread_mutex_lock(&start_flag_mutex);
start_flag = true;
pthread_cond_broadcast(&start_flag_condition);
pthread_mutex_unlock(&start_flag_mutex);
}
main函数启动所有线程后,按顺序加入工作线程和启动线程。所有 pthread 原语都在正确使用之前初始化并在正确使用后销毁。在大约 1/10 的运行中,我的程序被等待条件的工作线程卡住了。
我的问题是:拥有共享资源锁(在本例中为标志)的工作线程是否有可能在释放它之前被取消,从而导致其他线程永远等待?如果是这样,我可以做什么来防止它?
在我看来这确实是可能的。如果工作线程首先获得
start_flag_mutex
,它将阻止启动线程继续越过锁,因此启动线程将永远无法继续到可以设置 start_flag = true
的位置。