C++中的测试和测试并设置

5

我正在尝试在C++中实现测试和测试并设置功能。

根据C++原子标志查询状态的内容,我们无法检查标志的状态,那么有什么解决方法呢?

循环将像这样:

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” 在(lock_stream)期间


你的代码不够清晰,你想把它从false改为true,然后返回吗? - ronalchn
如果lock=false,则while循环中断,然后我进行测试和设置,如果返回false,则获取锁,想知道如何检查定义为std::atomic_flag lock_stream = ATOMIC_FLAG_INIT的lock_Stream状态。 - Majnu
你好像只是想使用 unique_lock 和 mutex? - ronalchn
是的,正在尝试实现TTAS https://en.wikipedia.org/wiki/Test_and_Test-and-set - Majnu
2个回答

2

如果你想在不设置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;
}

有没有使用测试和设置指令的解决方法? - Majnu
交换操作与测试并设置相同,将atomic_flag视为atomic<bool>的包装器。 - ronalchn
@J.S 不是所有的硬件都能实现你所需的功能,而 atomic_flag 被设计成绝对的最低公共因数。除非你的目标是这样的硬件或者你想要做的事情可以有效地使用它,否则你可能不应该使用它。 - bames53
@所有人 谢谢,我已经使用Exchange和bool实现了。 - Majnu

0

你的函数:

void ttas_lock()
{
    while(lock_Stream);
    if(!lock_stream.test_and_set()) return;
}

lock_Streamfalse后,程序将总是return。这不是你想要的。


asgn2.cpp:84:15: 错误:无法将‘((ttas*)this)->ttas::lock_stream’从‘std::atomic_flag’转换为‘bool’ while(lock_stream). 如何读取原子标志的值? - Majnu
因为你想要,所以在代码中加入 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); - Paul Evans
请问您能否解释一下? - Majnu
请查看std::atomic_flag - Paul Evans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接