【发布时间】:2021-09-29 07:42:02
【问题描述】:
我有一个函数:
int f(std::atomic<bool>& flag);
这需要检查flag 的值,这是一个被另一个线程更改的原子布尔值。如果我这样调用它,这个函数会按预期工作(f 看到另一个线程对标志所做的更改):
f(m_flag1);
我现在想要实现的目标稍微复杂一些,因为我不想将引用传递给单个原子 bool,而是传递给表达式,例如:
std::atomic<bool> x = m_flag1 && m_flag2;
f(x);
据我了解,直接将表达式传递给函数是错误的,因为这将是一个临时值,一旦调用函数就会被销毁。在我看来,r 值也不能作为参考传递。
不过,对x 的引用并没有多大帮助,因为我认为表达式只被评估一次,所以f 实际上并没有看到m_flag1 && m_flag2。
什么是获取表达式引用的简洁方法?我的其他线程应该持续评估x = m_flag1 && m_flag2; 还是有更清洁的方法?
【问题讨论】:
-
奇怪的是你必须传递表达式,(或接口错误)。
-
请注意,您不能以原子方式同时使用两个原子变量。甚至
m_flag1 && m_flag2在不同的时间(原子地)读取两个标志的值。 -
What is a clean way to get a reference to an expression?一个函数。 -
and passing that result不,您必须重构您的函数f以获取函数指针,或者充其量是提供基本operator ! && bool etc.布尔转换和一些运算符,然后在该对象内的那些运算符重载中实现您的逻辑。但我认为foo(std::function<bool()> flag)然后foo([flag1, flag2](){ return flag1 && flag2; })就足够了。 -
请注意,
a && b不是原子的,即使a和b都是原子的。我认为你不能在这里避免显式同步。