揮発性のメモ2

http://d.hatena.ne.jp/iww/

flockでスレッドごとにロックする

ファイルディスクリプタさえ違っていれば、スレッド間でも排他制御できるっぽい?


5秒間ロックを保持するスレッドを作成

void *flocktest( void *arg )
{
    int number = (int)arg;
    int fd;
    
    fd = open( "/tmp/hoge", O_RDONLY|O_CREAT, 0777 );

    printf("flock %d start\n", number);
    flock( fd, LOCK_EX );
    printf("flock %d flock OK\n", number);
    
    sleep(5);

    close(fd);
    printf("flock %d end\n", number);
    
    return NULL;
}

そのスレッドを5回くらい読んでみる

int main( int argc, char **argv )
{
    int i;
    pthread_attr_t attr;
    pthread_t tid;      

    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);

    for(i=1;i<=5;i++){
        pthread_create( &tid, &attr, flocktest, (void*)i );
//      sleep(3);
    }

    sleep(60);
    
    return 0;
}

実行結果:他のスレッドがロックを開放するのをちゃんと待っているっぽい。

$ ./flockthreadtest
flock 1 start
flock 1 flock OK
flock 2 start
flock 3 start
flock 4 start
flock 5 start
flock 1 end
flock 2 flock OK
flock 2 end
flock 3 flock OK
flock 3 end
flock 4 flock OK
flock 4 end
flock 5 flock OK
flock 5 end