スレッドセーフな方法でテストおよび設定する必要がある単純なブール値があります。1 つのスレッドが既に動作している場合は、2 番目のスレッドを終了させます。私が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
。皆さんありがとう!