我正在学习在Linux编程中使用互斥锁。我遇到了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");
}
抱歉格式少了代码..
此致
答案 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)
之前打印一些东西来检查它。