私はスレッドセーフな方法でテストして設定する必要がある単純なブール値を持っています。あるスレッドがすでに動作している場合は、2番目のスレッドを終了します。 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
を理解し:)私は、このスピンロック、たとえば、保存、オンライン多くの簡単な例を見つけることができないよう自信がないんだけどstd::atomic_flag
の適切な使用のためのテンプレート。皆さんありがとう!
このコードは機能しませんか? –
@BrendanLong - まだ完全にテストしていません。私がベンチャーになる前に私がコンセプトを最初に得ていることを確かめたいと思っています。「私のものをする」という部分は私の場合かなり広範囲になるでしょう。私は簡単に必要に応じてmutexを使用するようにこのコードを修正することができると認識しています... – Tom
あなたの質問に疑問符はありません。 – inf