Unix C+(boost)スレッド同期とスレッドグループ

2974 ワード

#include
#include
#include
#include
#include
boost::mutex mutex;
boost::condition_variable_any cond;
std::vector random_numbers;
void fill()
{
  std::srand(static_cast(std::time(0)));
  for (int i = 0; i < 3;++i)
  {
    boost::unique_lock lock(mutex);
    random_numbers.push_back(std::rand());
    cond.notify_all();
    cond.wait(mutex);
  }
}
void print()
{
  std::size_t next_size = 1;
  for (int i = 0; i < 3;++i)
  {
    boost::unique_lock lock(mutex);
    while (random_numbers.size() != next_size)
    {
      cond.wait(mutex);
    }
    std::cout << random_numbers.back()<<"---"<< std::endl;
   ++next_size;
    cond.notify_all();
  }
}
int main()
{
  boost::thread t1(fill);
  boost::thread t2(print);
  t1.join();
  t2.join();
}
コンパイル後の出力:
703604841--- 397897602--- 2011646528---
この例のプログラムは、wait()およびcount()を削除する.スレッドは、各ループ反復で1秒待つのではなく、できるだけ速く実行します.また、総額は計算されていません.デジタルは標準出力ストリームに完全に書き込まれます.
乱数を正しく処理するには、複数のスレッド間の特定の条件をチェックできる条件変数が必要であり、各独立したスレッドを同期させる必要があります.
前述したように、fill()関数は、反復ごとにランダム数を生成し、random_に配置するために使用される.numbers容器にあります.他のスレッドがこのコンテナに同時にアクセスしないように、それに応じて排他ロックを使用する必要があります.1秒待つのではなく、実際にこの例では条件変数が使われています.呼び出しnotify_all()は、呼び出しwait()を介してそれぞれこの通知を待っているスレッドを起動する.print()関数のforループを見ると、同じ条件変数がwait()関数によって呼び出されていることがわかります.このスレッドがnotify_all()で起動されると、この反発量を試みますが、fill()関数が完全に解放された後にのみ成功します.
ここでのコツは、wait()を呼び出すと、対応するパラメータによって伝達される反発量が解放されることである. notify_all()が呼び出されると、fill()関数は wait()を介してスレッドを解放する.その後、他のスレッド呼び出しnotify_all()が阻止され、待機し、乱数が標準出力ストリームに書き込まれると、print()で発生します.print()関数で呼び出されたwait()は、実際には、単独のwhileサイクルで発生することに留意されたい.print()関数で初めてwait()関数を呼び出す前に乱数を容器に入れたことを処理することを目的としている.random_を比較するnumbers内の要素の数と予想値は,乱数を標準出力ストリームに書き込むことに成功したことが分かった.
#include #include using namespace std; void f1(){     cout<<"f1()"<4 f1() f1() f2() f1()
このプログラムはスレッドグループの使い方を実証した.