【发布时间】:2021-03-30 01:30:40
【问题描述】:
我有邮箱类,线程之间共享发送和接收方法,线程:线程 1 发送消息,线程 2 和 3 接收消息,我必须如何使用互斥锁进行同步?
我尝试过的任何组合都没有成功。
std::mutex g_lock; //in global
void sendMessage(Message msg) {
if (g_lock.try_lock()) {
this_thread::sleep_for(100ms); // DELAY
messages->push_back(msg);
g_lock.unlock();
}
}
Receive方法也一样
完整代码: https://pastebin.com/7y2RC5br
此外,这段代码也无法调试,因为延迟会改变代码的逻辑。
代码的正确逻辑: thread2/3 尝试锁定并读取消息,清空然后解锁 thread1 尝试锁定并发送消息然后解锁 thread2/3 尝试锁定并读取 msg,获取 msg 并写入文件然后解锁
当我从线程 2/3 尝试互斥锁的 try_lock 时,我一直在不断地阻塞线程并且线程 1 在所有线程 2/3 之后一直在工作。
【问题讨论】:
-
你应该使用
std::lock_guard.` -
与
try_lock,如果没有获得锁,你将不会发送任何消息。 -
但是为什么不能获取锁呢?
-
你应该决定你是否负担得起不锁定。在某些情况下,您需要使用
lock()而不是try_lock()。 -
回复。
"But why lock can't be acquired?":大概是因为它已经被另一个线程拥有了?您确实需要提供一个 minimal reproducible example 来证明问题。