我正在阅读Qt的Blocking Fortune Client Example。有一段代码如下:
mutex.lock();
QString fortune;
in >> fortune;
emit newFortune(fortune);
cond.wait(&mutex);
serverName = hostName;
serverPort = port;
mutex.unlock();
我有点困惑为什么它会锁定第一行的互斥锁。因为财富和 都是局部变量。或者 emit 应该受到保护吗?
这是代码:http://doc.qt.io/qt-5/qtnetwork-blockingfortuneclient-fortunethread-cpp.html。整个项目可以在页面底部找到。
答案 0 :(得分:1)
似乎把锁放在几乎正确的位置(我仍然把它放在in >> fortune;
之后)。
为什么在发射之前可能需要lock
?
当一个线程在另一个线程中执行时,Emit会在一个线程中发生。因此可能发生以下事件:
showFortune
)nextFortune == currentFortune
为真,则线程的requestNewFortune
将在T2上下文中执行。requestNewFortune
尝试锁定互斥锁但失败并被暂停。cond.wait
,当它释放互斥锁并被暂停时cond.wakeOne
wakeOne
调用恢复,并正确完成其代码。如果我们在发出呼叫之前没有锁定互斥锁怎么办?我们最终可能会执行第4步执行
执行以
结尾的代码cond.wakeOne
并且此wakeOne
将永远丢失,当T1到达cond.wait
时,它将无法恢复,因为它等待的wakeOne
调用将丢失。