HP-UX / mutex


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

ナビゲーション

プロフィール

Photo Hondarer  My status

自分に正直に、目指す物を目指すかたちで、全ての人が幸せになれるシステムを削り出す職人でありたい。

Powered by
HndWiki 034496