2012-02-08 9 views
2

通常は、正しい順序は次のようなものです:pthread_init pthread_lock、pthread_destroyなどの呼び出しシーケンス?

pthread_mutex_init(&mutex,NULL); 

pthread_mutex_lock(&mutex); 

pthread_mutex_unlock(&mutex); 

pthread_mutex_destroy(&mutex); 

mutexが最初に初期化する必要があり、その後、pthread_mutex_lockpthread_mutex_unlockがクリティカルセクションを保護するために、それぞれのスレッドで呼び出すことができ、最終的にpthread_mutex_destroymutexを破壊するために呼び出されますすべてのスレッドが完了した後しかし、注文が混在している場合はどうなりますか?

私はエラーを見つけるために関数のシーケンスを混乱させますが、シーケンスが異なる方法で混乱するとすべてが正常に見えます。ここに例があります。

pthread_mutex_t mutex; 
static int count = 0; 

void* func(void* arg) 
{ 
    pthread_mutex_lock(&mutex); 
    *(int*)arg = *(int*)(arg) + 1; 
    printf("thread %d\n", *(int*)arg); 
    pthread_mutex_unlock(&mutex); 
} 

int main(int argc, char* argv[]) 
{ 
    int i; 
    pthread_mutex_init(&mutex, NULL); 

    pthread_mutex_destroy(&mutex); 

    for(i = 0; i < 3; i++) 
    { 
     pthread_t tid; 
     pthread_create(&tid, NULL, func, (void*)(&count)); 
     sleep(5); 
    } 

    printf("the main thread exit normally.\n"); 
} 

シーケンスがプログラムに関係するかどうかを質問したいと思います。呼び出しシーケンスを保証するための関数の中に何か他のものがありますか?これらの関数を順序なしで使用できる場合、なぜpthread_mutex_init()pthread_mutex_destroy()を定義する必要がありますか?

答えて

4

何が起こるかは、未定義の動作です。実装では、エラーを出力したり、プログラムを中断したり、WW IIIを起動したりすることがあります。または、正常に動作するように見えるかもしれませんが、保証はありません。

+0

この結論はどうやって描かれますか?それは異なるプラットフォーム上の特定の実装に依存しますか? – venuswu

+3

POSIX標準の関連部分を読んでください。定義されていない動作のために、実装は自由に行うことができます(例えば、提供された機能の悪用など、WWⅢを開始してユーザを処罰するなど)。 – janneb

関連する問題