C++ 中的测试和测试和设置
Posted
技术标签:
【中文标题】C++ 中的测试和测试和设置【英文标题】:Test and Test-and-set in c++ 【发布时间】:2015-10-09 22:32:32 【问题描述】:我正在尝试在 C++ 中实现 Test 和 Test-and-set。
根据C++ atomic_flag query state 我们无法检查标志状态,所以有什么解决方法
循环会是这样的
std::atomic_flag lock_stream = ATOMIC_FLAG_INIT;
void ttas_lock()
while(lock_Stream);
while(lock_stream.test_and_set());
return
错误:无法将“((ttas*)this)->ttas::lock_stream”从“std::atomic_flag”转换为“bool” while(lock_stream)
【问题讨论】:
你的代码不清楚,要不要把它从false改成true一次,然后返回? if lock=false while循环中断,然后我测试并设置,如果返回false我得到锁,想知道如何检查lock_Stream状态,定义为std::atomic_flag lock_stream = ATOMIC_FLAG_INIT; 听起来您只是想使用带有 unique_lock 的互斥锁? 是的,正在尝试实现 TTAS en.wikipedia.org/wiki/Test_and_Test-and-set 【参考方案1】:如果你想在不设置的情况下测试lock_stream,你应该使用std::atomic<bool>
。
因此,将其声明为:
std::atomic<bool> lock_stream = ATOMIC_FLAG_INIT;
您只需使用交换而不是测试和设置:
void ttas_lock()
while(lock_stream);
while(lock_stream.exchange(true)); // this is equivalent to test and set
return;
根据***,如果测试和设置失败,你应该重新测试,结果是:
void ttas_lock()
do
while (lock_stream) continue;
while (lock_stream.exchange(true)); // actual atomic locking
return;
【讨论】:
测试和设置指令有什么解决方法吗? 交换与测试和设置相同,将atomic_flag
视为atomic<bool>
的包装器
@J.S 不。有些硬件不一定能实现您正在寻找的功能,而atomic_flag
被设计为绝对最低的公分母。你可能不应该使用它,除非你的目标是这样的硬件,或者你想做的事情可以用它有效地实现。
@all 谢谢,我使用 exchange 和 bool 实现了。【参考方案2】:
你的功能:
void ttas_lock()
while(lock_Stream);
if(!lock_stream.test_and_set()) return;
将总是return
在lock_Stream
之后是false
。不是你想要的。
【讨论】:
asgn2.cpp:84:15: 错误:无法将 '((ttas*)this)->ttas::lock_stream' 从 'std::atomic_flag' 转换为 'bool' while(lock_stream )。如何读取原子标志值? @J.S 因为你想要:std::atomic<bool> lock_Stream = ATOMIC_FLAG_INIT;
然后`while (lock_Stream.test_and_set(std::memory_order_acquire));` 然后在稍后的某个时间点lock_Stream.clear(std::memory_order_release);
你能解释一下吗
请看std::atomic_flag以上是关于C++ 中的测试和测试和设置的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Visual Studio 2005 设置 Google C++ 测试框架 (gtest)