Linux中的pthread_mutex_trylock()

时间:2012-12-22 18:04:12

标签: c unix pthreads mutex errno

我正在学习在Linux编程中使用互斥锁。我遇到了trylock函数,它首先检查互斥锁是否可用它会锁定它,否则返回。

现在我的问题是:

  • 在调用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");
}

抱歉格式少了代码..

此致

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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));
}

答案 2 :(得分:0)

调用trylock后,在没有执行临界区的情况下到达函数结束后是否会返回?

如果pthread_mutex_trylock(&mutex)成功(即返回0),则执行第一部分(即临界部分)并返回功能。如果pthread_mutex_trylock(&mutex)不成功(即返回-1),那么部分将被执行并希望thread busy将被打印,函数将返回而不执行临界区。

为什么不在我的代码中打印errno?

pthread_mutex_trylock(&mutex)的调用总是成功,如果你看到i的所有值(即1-5)被打印,那么就是这种情况。或者errorno不是EBUSY,你可以通过在if(errno== EBUSY)之前打印一些东西来检查它。