Pthread の排他処理のサンプル
自分用。
- ソース (pthread_mutex.c)
#include <stdio.h> #include <unistd.h> #include <pthread.h> #include <stdlib.h> #define MAX_THREADS 3 void start_threads(void); void thread_main(void *args); void synchronized_printf(const char* s); static pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; static pthread_mutexattr_t mattr; void start_threads(){ pthread_t pt[MAX_THREADS]; int i; // スレッドの作成 for(i=0; i<MAX_THREADS; i++){ pthread_create( &(pt[i]), NULL, &thread_main, &i ); } // joinしておかないとメインスレッドが先に終了してしまう。 for(i=0; i<MAX_THREADS; i++){ pthread_join(pt[i], NULL); } return; } void thread_main(void *args){ int i = *((int *)args); int j=0; while(j++<5){ char s[100]; sprintf(s, "[Thread:%d]", i); synchronized_printf(s); sleep( 1 ); } } void synchronized_printf(const char* s){ #ifdef USE_MUTEX pthread_mutex_lock(&mut); //排他処理のためにロックを取得 #endif printf(">>"); printf("%s", s); sleep( rand()%10 ); printf("<<\n"); #ifdef USE_MUTEX pthread_mutex_unlock(&mut); //排他処理のためにロックを解放 #endif } int main(){ pthread_mutex_init(&mut, &mattr); // mutexの初期化 start_threads(); exit(0); }
排他処理なし $ gcc -Wall -g -lpthread pthread_mutex.c -o pthread_mutex 排他処理あり $ gcc -Wall -g -DUSE_MUTEX -lpthread pthread_mutex.c -o pthread_mutex
- 実行結果(排他処理なし)
各スレッドの出力が入り交じっている。
$ ./pthread_mutex >>[Thread:0]>>[Thread:1]>>[Thread:2]<< >>[Thread:0]<< >>[Thread:1]<< >>[Thread:2]<< << >>[Thread:0]>>[Thread:1]<< << >>[Thread:2]>>[Thread:1]<< << >>[Thread:1]>>[Thread:0]<< << >>[Thread:2]<< << >>[Thread:2]>>[Thread:0]<< <<
- 実行結果(排他処理あり)
各スレッドの出力が綺麗にわかれている。
$ ./pthread_mutex >>[Thread:0]<< >>[Thread:1]<< >>[Thread:2]<< >>[Thread:0]<< >>[Thread:1]<< >>[Thread:2]<< >>[Thread:0]<< >>[Thread:1]<< >>[Thread:2]<< >>[Thread:0]<< >>[Thread:1]<< >>[Thread:2]<< >>[Thread:0]<< >>[Thread:1]<< >>[Thread:2]<<