我有一個簡單的布爾值,我需要以線程安全的方式進行測試和設置。如果一個線程已經工作,我想第二個線程退出。如果我正確理解std::atomic_flag
,這應該可以正常工作。但是,我不相信我的理解std::atomic_flag
正確:)我似乎無法在網上找到許多簡單的例子,保存這個環形鎖例如:C++ 11 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
的模板。謝謝大家!
此代碼無效嗎? – 2013-04-04 19:24:17
@BrendanLong - 我還沒有完全測試它;只是想在我冒險前先確定我是否理解了概念......在我的情況下,「做我的東西」部分將會相當廣泛。雖然我認識到如果需要,我可以輕鬆修改此代碼以使用互斥鎖... – Tom 2013-04-04 19:28:55
在您的問題中沒有問號。 – inf 2013-04-04 20:02:11