我有一个简单的布尔值,需要以线程安全的方式进行测试和设置。如果一个线程已经在工作,我希望第二个线程退出。如果我理解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
. 谢谢大家!