【问题标题】:QMutex - protect within a thread but not across threadsQMutex - 在线程内保护但不在线程间保护
【发布时间】:2013-10-03 08:18:27
【问题描述】:

我需要保护资源不被中断,在这种情况下写入套接字。我有一个类 TelnetServer,它被实例化了很多次(每个使用的连接一次)。

我想防止对单个用户的写入被另一个对同一用户的写入中断(即锁定互斥锁以写入该一个套接字)。但是,我不想在写入单个用户时冻结对所有套接字的所有写入。澄清(伪c++):

Class TelnetThread {
  QMutex mutex;

  void writeToSocket() {
      mutex.lock();
      socket->write(string);
      mutex.unlock();
  }
}

所以如果我有 30 个 TelnetThread 正在运行,写入一个套接字不应阻止同时写入另一个线程。但是,如果几个槽触发写入同一个套接字/线程,那么它们应该被序列化。

我应该在哪里声明我的互斥变量?如果我将其设为类(线程)变量,那不会序列化所有线程(此类的所有实例)上的所有套接字写入吗?如果我将其设为 writeToSocket 中的函数变量,那么我认为它甚至不会将写入序列化到同一个套接字。

帮助...我该怎么做?

【问题讨论】:

  • 你应该在与套接字成员相同的范围内声明你的互斥锁。
  • 如果您希望每个套接字有一个互斥锁,请与每个套接字配对一个
  • 我不明白怎么做。根据我的阅读,如果我在类级别声明一个套接字变量,在类级别声明一个互斥锁,那么(该类的)所有线程共享同一个互斥锁,这不是我想要的。

标签: qt qtcore qmutex


【解决方案1】:

即锁定互斥体以写入该套接字

您可以编写一个封装的套接字写入锁类型,或者只是在同一个单元中将互斥锁与对应的互斥锁一起处理。

正如我在您之前的一个帖子中所写,我会考虑在这种情况下使用 QMutexLocker。它更不容易出错,也使代码更短。

【讨论】: