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