-
atomicフラグを使用する方法: atomicフラグは、複数のスレッドが同時にアクセスしても安全に読み書きできるデータ型です。以下は、atomicフラグを使用してスレッド間の同期を実現する例です。
#include <atomic> #include <thread> std::atomic<bool> flag{false}; void threadFunc() { // スレッドの処理 flag.store(true, std::memory_order_release); // フラグをセットし、他のスレッドに通知 } int main() { std::thread t(threadFunc); // フラグがセットされるまで待機 while (!flag.load(std::memory_order_acquire)) { // フラグがセットされるまで待機 } t.join(); return 0; }
この方法では、atomicフラグを使用してスレッド間でのフラグの読み書きを同期し、待機ループを使用して他のスレッドからの通知を待機します。
-
条件変数を使用する方法: C++11以降では、条件変数を使用してスレッド間の同期を行うことができます。以下は、条件変数を使用したスレッド間の同期の例です。
#include <condition_variable> #include <mutex> #include <thread> std::mutex mutex; std::condition_variable cv; bool flag = false; void threadFunc() { // スレッドの処理 { std::lock_guard<std::mutex> lock(mutex); flag = true; } cv.notify_one(); // 他のスレッドに通知 } int main() { std::thread t(threadFunc); { std::unique_lock<std::mutex> lock(mutex); cv.wait(lock, []{ return flag; }); // フラグがセットされるまで待機 } t.join(); return 0; }
この方法では、条件変数を使用してスレッドの待機と通知を行います。スレッド間の同期は、mutex(ミューテックス)とflag(フラグ)変数を使用して行われます。
これらの方法を使用することで、atomic_notify_oneが使用できない場合でも、スレッド間の同期を安全に行うことができます。適切な方法を選択し、プログラムの要件に応じて使用してください。