pthread 在释放锁之前被取消

问题描述 投票:0回答:1

我对 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 的运行中,我的程序被等待条件的工作线程卡住了。

我的问题是:拥有共享资源锁(在本例中为标志)的工作线程是否有可能在释放它之前被取消,从而导致其他线程永远等待?如果是这样,我可以做什么来防止它?

c multithreading pthreads locking race-condition
1个回答
0
投票

在我看来这确实是可能的。如果工作线程首先获得

start_flag_mutex
,它将阻止启动线程继续越过锁,因此启动线程将永远无法继续到可以设置
start_flag = true
的位置。

© www.soinside.com 2019 - 2024. All rights reserved.