C++ で std::condition_variable の notify_one を用いて他のスレッドを起こす ― 2020年10月04日 11時59分07秒
以下の例では、十個のスレッドを生成し condition_variable を用いて待機。メインスレッドが一つスレッドが終了する度に、一つのスレッドを起こす。
% cat condition_variable.cpp
#include <condition_variable>
#include <iostream>
std::mutex m;
std::condition_variable cv;
int running = 10;
void print( int n )
{
std::unique_lock< std::mutex > lock( m );
std::cout << "THREAD in " << n << std::endl;
cv.wait(lock);
--running;
std::cout << "THREAD out " << n << std::endl;
}
int main()
{
std::thread threads[ running ];
for( int i = 0; i < running; ++i )
threads[ i ] = std::thread( print, i );
while( running > 0 )
{
std::unique_lock< std::mutex > lock( m );
cv.notify_one();
}
for( auto& t: threads )
t.join();
std::cout << "DONE" << std::endl;
}
コンパイルして実行した結果。スレッドライブラリを使うので -lptherad が必要になる。
なお、実行結果はプログラムを走らせる度に変わる。
% c++ -std=c++11 condition_variable.cpp -lpthread
% ./a.out
THREAD in 1
THREAD in 2
THREAD in 0
THREAD in 5
THREAD in 7
THREAD in 9
THREAD in 6
THREAD in 3
THREAD out 1
THREAD in 4
THREAD out 9
THREAD out 5
THREAD out 0
THREAD out 2
THREAD out 6
THREAD in 8
THREAD out 3
THREAD out 8
THREAD out 4
THREAD out 7
DONE
最近のコメント