3

我正在学习在 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");
}

抱歉格式化少代码..

问候

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 回答
1

当调用trylock时,它是否在到达函数末尾而不执行临界区后返回?

如果pthread_mutex_trylock(&mutex)成功(即返回 0),则将执行第一部分(即关键部分)并返回函数。如果pthread_mutex_trylock(&mutex)不成功(即返回-1),则将执行else部分并希望thread busy将其打印并且函数将返回而不执行关键部分。

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

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

于 2012-12-22T18:21:35.577 回答
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 回答