C++ で std::condition_variable の notify_one を用いて他のスレッドを起こす2020年10月04日 11時59分07秒

C++11 からはスレッドのサポートが言語の一部になった。スレッドの生成std::mutex による排他制御と共に必要になるのが、condition variable。mutex で排他制御は出来るが、排他制御が終ったことを伝えるのが必要になってくる。それを行えるのが、condition_variable。

以下の例では、十個のスレッドを生成し 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
なお、実行結果はプログラムを走らせる度に変わる。

前回次回

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2020/10/04/9302060/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。