3

当我有三个或更多线程时,如果互斥锁在一个线程中解锁,下一个将处理哪一个?他们是先进先出规则吗?如果不是FIFO,几个线程wait unlock(),会不会有一个线程永远不会处理?他们是否在排序队列中等待,排序规则是什么?

示例代码:

//thread No.1
func1(){
  std::unique_lock<mutex> lock(_mtx);
  //do something, now in here,and will leave this thread then mutex will unlock
}

//thread No.2
func2(){
  std::unique_lock<mutex> lock(_mtx);
  //do something
}

//thread No.3
func3(){
  std::unique_lock<mutex> lock(_mtx);
  //do something
}
4

1 回答 1

3

操作系统将决定哪个线程获得互斥锁是最有效的。您有责任确保安排的任何线程都按您需要的方式工作。

通常,线程不可能长时间拒绝互斥锁,因为最终所有其他线程将阻塞或耗尽它们的时间片,从而允许该线程获取互斥锁。但该平台不提供任何特别的公平保证。

你不会想要先进先出。那将是一场彻底的灾难。想象一下,如果每个线程需要获取锁 100 次。现在一个线程获得锁,释放它,然后几乎立即尝试获得锁。您是否希望它每次都停止并切换到其他线程之一?您想要 300 次上下文切换和启动/停止吗?你绝对不会。

于 2021-10-27T10:12:34.227 回答