HP-UX / mutex
View Outline
POSIX上で排他を実現するサンプル
HP-UXでの注意事項
HP-UX上でコンパイルする場合、下記の注意事項を参考のこと。 (http://docs.hp.com/ja/B2355-60104-07/rn03re52.html)
マルチスレッドのアプリケーションでは、コンパイル時に適切な POSIX リビジョンレベル (199506) を定義して、-lpthread によりpthread ライブラリにリンクしなければなりません。例:
cc -D_POSIX_C_SOURCE=199506L -o myapp myapp.c -lpthread
すべてのプログラムソースには、ヘッダーファイル <pthread.h> が含まれていなければなりません。
注記: ("-Aa" を指定して) ANSI コンパイルを明示的に指定する場合、POSIX リビジョンレベルを定義すると、プログラムは POSIX ネームスペース内のインタフェースだけを使用します。より大きな X/Open ネームスペース内のインタフェースが呼び出される場合には、-D_POSIX_C_SOURCE=199506L の他に、-D_XOPEN_SOURCE_EXTENDED または -D_HPUX_SOURCE のいずれかのコンパイラオプションの指定が必要です。-Ae を指定して (あるいは "-A" を指定せずに) コンパイルすると、-D_HPUX_SOURCE が暗黙的に指定されます。
注記: 一部のドキュメンテーションでは、コンパイルに -D_REENTRANT を使用するようにお薦めしています。これも正しく機能しますが、旧形式であると考えられます。
サンプルプログラム
/* ミューテックスのサンプル */ /* cc -lpthread -o mutex mutex.c (Linux) */ #include<stdio.h> #include<pthread.h> pthread_mutex_t mutex; /* ミューテックス */ int main(void); void* func1(void* pParam); void* func2(void* pParam); void* func1(void* pParam) { int i; for(i = 0;i < 10;i++) { pthread_mutex_lock(&mutex); /* ミューテックス取得 */ printf("output"); usleep(0); printf(" by"); usleep(0); printf(" func1 i = %d\n",i); pthread_mutex_unlock(&mutex); /* ミューテックス解放 */ } return NULL; } void* func2(void* pParam) { int i; for(i = 0;i < 10;i++) { pthread_mutex_lock(&mutex); /* ミューテックス取得 */ printf("OUTPUT"); usleep(0); printf(" BY"); usleep(0); printf(" FUNC2 I = %d\n",i); pthread_mutex_unlock(&mutex); /* ミューテックス解放 */ } return NULL; } int main(void) { pthread_t tid1; pthread_t tid2; pthread_mutex_init(&mutex,NULL); /* ミューテックス初期化 */ /* スレッド1生成 */ if(pthread_create(&tid1,NULL,func1,NULL) != 0) { perror("pthread_create"); } /* スレッド2生成 */ if(pthread_create(&tid2,NULL,func2,NULL) != 0) { perror("pthread_create"); } /* スレッド1終了待ち */ if(pthread_join(tid1,NULL) != 0) { perror("pthred_join"); } /* スレッド2終了待ち */ if(pthread_join(tid2,NULL) != 0) { perror("pthred_join"); } pthread_mutex_destroy(&mutex); /* ミューテックス破棄 */ /* ただし、Linuxの実装では意味 */ /* がないようである */ return 0; }