gpt4 book ai didi

c++ 11 std::atomic_flag,我使用正确吗?

转载 作者:可可西里 更新时间:2023-11-01 18:28:28 25 4
gpt4 key购买 nike

我有一个简单的 bool 值,需要以线程安全的方式进行测试和设置。如果一个线程已经在工作,我希望第二个线程退出。如果我明白std::atomic_flag正确,这应该可以正常工作。但是,我不确定我是否正确理解了 std::atomic_flag :) 我似乎无法在网上找到很多简单的示例,除了这个自旋锁示例:

// myclass.cpp
#using <atomic>

namespace // anonymous namespace
{
std::atomic_flag _my_flag = ATOMIC_FLAG_INIT;
} // ns

myclass::do_something()
{
if ( !::_my_flag.test_and_set() ) )
{
// do my stuff here; handle errors and clear flag when done
try
{
// do my stuff here
}
catch ( ... )
{
// handle exception
}

::_my_flag.clear(); // clear my flag, we're done doing stuff
}
// else, we're already doing something in another thread, let's exit
} // do_something

更新:根据以下建议更新了代码,形成了正确使用 std::atomic_flag 的合适模板。谢谢大家!

最佳答案

atomic_flag 是一个非常低级的构造,并不意味着被广泛使用。就是说,我相信您的使用按预期进行,除非在特殊情况下可能清除标志。如果发生与 std::exception 匹配的异常以外的异常,则该标志不会被清除。

通常 RAII 应该用于此类事情。 “R”通常代表“资源”,但我喜欢 Jon Kalb 的 usage而不是“责任”。设置标志后,您有责任在完成后清除标志,因此您应该使用 RAII 来确保履行职责。如果在特殊情况下您需要做的所有事情都可以通过这种方式完成,那么 try/catch 对就会消失。

if ( !std::atomic_flag_test_and_set( &::_my_flag ) )
{
flag_clearer x(&::_my_flag);

// do my stuff here
}

但是你不需要自己写一个flag_clearer类型。相反,您可以简单地使用更高级别的构造,例如互斥锁和 lock_guard:

namespace
{
std::mutex my_flag;
}

myclass::do_something()
{
if ( my_flag.try_lock() )
{
std::lock_guard<std::mutex> x(my_flag, std::adopt_lock);
// do my stuff here
}
// else, we're already doing something in another thread, let's exit
}

关于c++ 11 std::atomic_flag,我使用正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15819930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com