当我有三个或更多线程时,如果互斥锁在一个线程中解锁,下一个进程将是哪个?他们是FIFO规则吗?如果不是FIFO,几个线程等待解锁(),会有一个线程永远不会处理?它们是否在排序队列中等待?排序规则是什么?
示例代码:
//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
}
操作系统将决定哪个线程获得互斥锁是最有效的。你有责任确保被调度的线程做你需要它做的工作。
一般来说,一个线程不可能长时间被拒绝获得互斥锁,因为最终所有其他线程都会阻塞或耗尽它们的时间片,从而允许该线程获得互斥锁。但是这个平台并没有提供任何公平的保证。
你不会想要FIFO。那将是一场彻底的灾难。想象一下,如果每个线程需要获取锁100次。现在一个线程获得锁,释放它,然后几乎立即尝试获得锁。您是否希望它每次都停止并切换到另一个线程?你想要300个上下文切换和开始/停止吗?你绝对不需要。