【发布时间】:2021-01-08 20:14:43
【问题描述】:
我想知道是否需要在锁定的互斥锁范围内重置谓词布尔变量。现在,我有一个带有 lambda 函数作为谓词参数的 std::unique_lock - lambda 函数返回一个布尔标志。这是否意味着我需要在锁定保护范围内将布尔标志设置回 false?
如果我不重置布尔标志,它似乎工作得更快,但我不确定这是否是解决此问题的安全方法。
#include <thread>
#include <condition_variable>
#include <mutex>
std::condition_variable _conditional;
bool processed = false;
std::mutex _mutex;
void Worker() {
while (true) {
//Doing other things ..
//
{
//mutating shared data
std::unique_lock<std::mutex> _lock(_mutex);
_conditional.wait(_lock, [] { return processed; });
processed = false? //do I set this boolean back to false or just leave as is?
data++;
}
}
}
void Reader() {
//just prints out the changed data
while (true) {
std::cout << data << std::endl;
processed = true;
_conditional.notify_one();
}
}
int main(){
std::thread t1(Worked);
std::thread t2(Reader);
t1.join();
t2.join();
}
【问题讨论】:
-
这是设计此设置的人的问题。布尔标志的用途是什么?什么应该导致它被设置为
true?什么应该导致它被设置为false?或者也许:false值代表什么?true值代表什么? -
@JaMiT
true表示我刚刚完成了对共享数据的读取,并且Worker()线程现在能够对其进行变异,从而用.notify_one()通知工作线程它可以现在继续锁定和更改共享数据。我想我困惑的地方是我什至不知道我是否需要将其改回false?因为它仍然会运行(更快)而无需将其更改回false。这是否意味着工作线程甚至不会等待,因为无论是否调用.notify_one(),该标志始终为真? -
如果你引入了太多的含义,你很可能会把自己弄糊涂。尝试 "
true表示我刚刚完成了对共享数据的读取,并且Worker()线程现在能够对其进行变异" 句号。 不要'当标志为true时,不了解发生的情况;看看那个值代表什么。true值表示data已被读取并准备好进行处理。简短,甜蜜,并且可以被否定:false值意味着data尚未被读取或data未被处理。当_lock超出范围时,以下哪一项成立?
标签: c++ multithreading lambda predicate condition-variable