为什么要锁定QMutex?

时间:2015-06-13 09:05:14

标签: qt

我正在阅读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。整个项目可以在页面底部找到。

1 个答案:

答案 0 :(得分:1)

似乎把锁放在几乎正确的位置(我仍然把它放在in >> fortune;之后)。 为什么在发射之前可能需要lock

当一个线程在另一个线程中执行时,Emit会在一个线程中发生。因此可能发生以下事件:

  1. T1发出信号并被操作系统暂停。
  2. T2获取时间量并接收到开始执行时隙(showFortune
  3. 的信号
  4. 如果nextFortune == currentFortune为真,则线程的requestNewFortune将在T2上下文中执行。
  5. requestNewFortune尝试锁定互斥锁但失败并被暂停。
  6. T1恢复并继续cond.wait,当它释放互斥锁并被暂停时
  7. 自从互斥锁被释放后,T2恢复并执行其代码,最终以cond.wakeOne
  8. 结束
  9. T1通过wakeOne调用恢复,并正确完成其代码。
  10. 如果我们在发出呼叫之前没有锁定互斥锁怎么办?我们最终可能会执行第4步执行

      

    执行以cond.wakeOne

    结尾的代码

    并且此wakeOne将永远丢失,当T1到达cond.wait时,它将无法恢复,因为它等待的wakeOne调用将丢失。