読者です 読者をやめる 読者になる 読者になる

Pthread の排他処理のサンプル

C Linux 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]<<