如果我希望线程暂停一段时间,直到满足某些条件,我可以双重锁定互斥锁吗?
这是我现在正在使用的想法的基本示例:
class foo
{
public:
static std::mutex processingMutex;
void infinite_processing_loop()
{
processingMutex.lock(); // Lock the mutex, initially
while(true)
{
if ( /*ready for this thread to process data*/ )
{
// ... perform one round of data processing ...
}
else // NOT ready for this thread to process data
{
/* Pause this thread,
and wait for another thread to unlock this mutex
(when more data might be ready for processing) */
processingMutex.lock();
}
}
processingMutex.unlock(); // Will never be executed
}
};
当处理线程试图双重锁定互斥锁时,处理线程是否会停止? 并且另一个线程可以解锁相同的互斥锁,导致暂停的处理线程恢复吗?
或std::mutex
是否自动识别互斥锁何时从同一处理线程锁定两次?
答案 0 :(得分:4)
std::mutex通常会在第二次尝试通过所有者线程锁定时死锁。即使它没有,它也被认为是应用程序尝试使用此原语的错误。
std::recursive_mutex将允许重入锁定。因此,如果锁定两次,则需要先解锁两次才能使互斥锁可以使用互斥锁。
有一种思想流派认为,任何涉及在已经锁定之后递归获取互斥锁的设计都是一个设计缺陷。我会尝试挖掘该线程并添加它。