Pスレッドのmutexを使ったプロセス間での排他制御
// gcc -Wall -lpthread test_mutex.c -lrt // 動かんときは rm /dev/shm/hoge #include <fcntl.h> // O_CREAT #include <stdio.h> // printf #include <unistd.h> // sleep #include <sys/mman.h> // mmap #include <stdlib.h> // exit #include <pthread.h> // pthread #define die(msg) do{ perror(msg); exit(EXIT_FAILURE); }while(0) int main() { pthread_mutex_t *mp; // まず共有メモリを普通にオープンし、 int fd = shm_open("/hoge", O_RDWR, 0600); if(fd<0){ // 共有メモリが無いときは新規に作成した上で fd = shm_open("/hoge", O_CREAT|O_EXCL|O_RDWR, 0600); if(fd<0) die("shm_open O_CREAT"); // 初期化をおこなう ftruncate(fd, sizeof(pthread_mutex_t)); mp = mmap(NULL, sizeof(pthread_mutex_t), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); // mutexを作成、初期化 pthread_mutexattr_t mattr; pthread_mutexattr_init(&mattr); // mutexの設定値を初期化 pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED); // プロセス間有効に設定 pthread_mutex_init(mp, &mattr); // mutex本体を初期化 }else{ // 共有メモリ上のmutexを参照する mp = mmap(NULL, sizeof(pthread_mutex_t), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); } printf("ロック\n"); pthread_mutex_lock(mp); printf("30秒スリープ\n"); sleep(30); printf("アンロック\n"); pthread_mutex_unlock(mp); return 0; }
- 長所
- 結構速い
- sem_waitよりもさらにちょっとだけ速い
- 1割くらい速い感じ
- プロセス間の待ち合わせが倍くらい速い気がする
- 短所
- 実装が超面倒くさい
- 共有メモリを確保するのがだるい
- mutexが初期化されてるかどうかも意識しないといけない
- プログラムが途中で死ぬとロックがかかりっぱなしになる
- 他言語と連携はできない
- 実装が超面倒くさい