通常は、正しい順序は次のようなものです: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_lock
とpthread_mutex_unlock
がクリティカルセクションを保護するために、それぞれのスレッドで呼び出すことができ、最終的にpthread_mutex_destroy
はmutex
を破壊するために呼び出されますすべてのスレッドが完了した後しかし、注文が混在している場合はどうなりますか?
私はエラーを見つけるために関数のシーケンスを混乱させますが、シーケンスが異なる方法で混乱するとすべてが正常に見えます。ここに例があります。
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()
を定義する必要がありますか?
この結論はどうやって描かれますか?それは異なるプラットフォーム上の特定の実装に依存しますか? – venuswu
POSIX標準の関連部分を読んでください。定義されていない動作のために、実装は自由に行うことができます(例えば、提供された機能の悪用など、WWⅢを開始してユーザを処罰するなど)。 – janneb