3

Linux プログラミングでミューテックスを使用する方法を学んでいます。私はtrylock関数に出くわしました.mutexが利用可能かどうかを最初にチェックし、それ以外の場合はロックし、戻ります。

今私の質問は:

  • trylock が呼び出されたときに、クリティカル セクションを実行せずに関数の最後に到達した後に戻りますか?
  • errno以下のコードで印刷されないのはなぜですか?

コードは次のとおりです。

int main()
{
pthread_t tid[5];

int i;

if(pthread_mutex_init(&mutex,NULL))
    printf("Failed to lock the mutex\n");
for(i=0;i<5;i++)
{
    if(pthread_create(&tid[i],NULL,func,&i))
        printf("Failed to create a thread\n");

    if(errno==EBUSY)
        printf("thread busy\n");

}

for(i=0;i<5;i++)
{
    if(pthread_join(tid[i],NULL))
        printf("Failed to wait for thread %d\n",i);
}

printf("All threads terminated\n");

return 0;
}

void *func(void * arg)
{
int i=*(int *)arg;

if(pthread_mutex_trylock(&mutex)==0)
{
    sleep(5);
printf(" i is %d\n",i);

pthread_mutex_unlock(&mutex);
}
else
    if(errno== EBUSY)
            printf("thread busy\n");
}

フォーマットレスコードで申し訳ありません..

よろしく

4

3 に答える 3

2

pthread_mutex_trylock()設定しませんerrno- 単に戻り値を使用します:

int result = pthread_mutex_trylock(&mutex);

if(result==0)
{
    sleep(5);
    printf(" i is %d\n",i);

    pthread_mutex_unlock(&mutex);
}
else
    if (result == EBUSY)
            printf("thread busy\n");
}
于 2012-12-22T18:13:58.590 に答える
0

pthread_mutex_trylock のドキュメントによると、ミューテックスをロックできない場合はエラー コードが返され、errno が EBUSY に設定されません。期待される結果を得るには、次のようにする必要があります。

int rc;
if((rc = pthread_mutex_trylock(&mutex))==0) {
  sleep(5);
  printf(" i is %d\n",i);

  pthread_mutex_unlock(&mutex);
} else {
  printf("thread busy: %s\n", strerror(rc));
}
于 2012-12-22T18:14:06.547 に答える