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&lt;bool&gt;的包装器 @J.S 不。有些硬件不一定能实现您正在寻找的功能,而atomic_flag 被设计为绝对最低的公分母。你可能不应该使用它,除非你的目标是这样的硬件,或者你想做的事情可以用它有效地实现。 @all 谢谢,我使用 exchange 和 bool 实现了。【参考方案2】:

你的功能:

void ttas_lock()

    while(lock_Stream);
    if(!lock_stream.test_and_set()) return;

总是returnlock_Stream 之后是false。不是你想要的。

【讨论】:

asgn2.cpp:84:15: 错误:无法将 '((ttas*)this)->ttas::lock_stream' 从 'std::atomic_flag' 转换为 'bool' while(lock_stream )。如何读取原子标志值? @J.S 因为你想要:std::atomic&lt;bool&gt; 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++ 中的测试和测试和设置的主要内容,如果未能解决你的问题,请参考以下文章

为 CTest 测试设置环境变量时遇到问题

如何使用 Visual Studio 2005 设置 Google C++ 测试框架 (gtest)

设置用户数和编号。 VS2015负载测试中的动态迭代次数

settings.DEBUG 的值在 Django 测试中的设置和 url 之间变化

比较和交换与测试和设置

UITabBarController 中的测试方法正确设置标题