she*_*ill 0 c++ mutex context-switch
好的......这里有一些关于这个问题的背景知识.我有一些"关键"代码,我试图用互斥锁保护.它就是这样的
Mutex.Lock()
//关键代码//某个文件IO
Mutex.Unlock().
现在问题是我的程序似乎因此而"卡住".让我举个例子来解释一下.
Thread_1进来了; 并转到Mutex.Lock()并开始执行关键代码.在关键代码中; 它需要做一些文件IO.现在就在这一点上; 我相信'上下文切换'发生并且Thread_2进入并阻塞Mutex.Lock()(因为Thread_1具有锁定).一切似乎都很好,但就我而言; 程序'挂起'在这里..我唯一能想到的是,不知何故Thread_2一直保持阻塞,并且不会切换回Thread_1?
更多信息:在linux上使用pthread_mutex_init和pthread_mutex_lock.
正如其他人所提到的,你可能有一个僵局.
边注:
您需要确保在关键代码块中没有任何未捕获的异常.否则锁将永远不会被释放.您可以使用RAII锁来解决此问题:
class SingleLock {
public:
SingleLock(Mutex &m) : m(m) { m.Lock(); }
~SingleLock() { m.Unlock(); }
private:
Mutex m;
};
...
{
SingleLock lock(mutex);
// critical code // some file IO
}
...
Run Code Online (Sandbox Code Playgroud)