C++
POSIX

pthread_cond_wait の簡単なテスト

pthread_cond_waitでpthread_cond_signalによってシグナルを受けるまで処理を待ちます。

SampleCondWait.cpp
#include <stdio.h>
#include <pthread.h>
#include <iostream>
#include <thread>

#define test_cond_wait

pthread_mutex_t mutex;
pthread_cond_t cond;
static void *thread1(void*);

int main(void)
{
    pthread_t thread_id = 0;

    pthread_mutex_init(&mutex, NULL);
    pthread_cond_init(&cond, NULL);

    if(pthread_create(&thread_id, NULL, thread1, NULL) < 0)
    {
      std::cout << "ERROR for creating thread " << std::endl;
      exit(1);
    }

#ifdef test_cond_wait
    pthread_mutex_lock(&mutex);
    pthread_cond_wait(&cond, &mutex);
    pthread_mutex_unlock(&mutex);
#endif

   std::cout << "Main is working" << std::endl;

   if(pthread_join(thread_id, NULL) < 0)
   {
     std::cout << "ERROR for finishing thread " << std::endl;
     exit(1);
   }

   std::cout << "Main End" << std::endl;
}

void *thread1(void *arg)
{
   std::cout << "Thread is working" << std::endl;

#ifdef test_cond_wait
   pthread_mutex_lock(&mutex);
   pthread_cond_signal(&cond);
   pthread_mutex_unlock(&mutex);
#endif
}

以下はpthread_cond_waitを動作させた場合の実行結果

$ g++ -std=c++11 SampleCondWait.cpp -lpthread
$ ./a.out
Thread is working
Main is working
Main End

以下はpthread_cond_waitをプリプロセッサで無効にした場合の実行結果

$ g++ -std=c++11 SampleCondWait.cpp -lpthread
$ ./a.out
Main is working
Thread is working
Main End

pthread_cond_waitを使った場合、
pthread_createが呼ばれてthread1を作りMain文はpthread_cond_waitで、
thread1からpthread_cond_signalのシグナルを待ち受けます。
そのため、先に"Thread is working"が表示され、thread1が終了し、Main処理が終了します。

pthread_cond_waitを使わなかった場合、
pthread_createが呼ばれてthread1を作っている間にMain文の処理は進み、
"Main is working"を表示してpthread_joinでthread1が終了するまで待ちます。
そのため、後から"Thread is working"が表示され、Thread1が終了し、Main文が終了します。