揮発性のメモ2

知識をメモ書きしておく

pthread_mutex_lock

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;
}

Man page of PTHREAD_MUTEX

  • 長所
    • 結構速い
    • sem_waitよりもさらにちょっとだけ速い
      • 1割くらい速い感じ
      • プロセス間の待ち合わせが倍くらい速い気がする
  • 短所
    • 実装が超面倒くさい
      • 共有メモリを確保するのがだるい
      • mutexが初期化されてるかどうかも意識しないといけない
    • プログラムが途中で死ぬとロックがかかりっぱなしになる
    • 他言語と連携はできない