如何测试信号量是否被阻塞?
我试过函数sem_trywait()
但它没有叫醒,我现在不知道为什么,你能帮我一下吗?
示例如下(使用信号量解决睡眠理发问题的示例程序):http://users.dickinson.edu/~braught/courses/cs354s00/classes/code/SleepBarber.src.html
我想用sem_trywait()
来检测,是不是信号量阻塞:
void *customer(void *number) {
int num = *(int *)number;
//there is my problem...
//you must waiting to free semaphore...
while(sem_trywait(&waitingRoom)){
printf("Semaphore is full you must wait!");
}
// Wait for space to open up in the waiting room...
sem_wait(&waitingRoom);
printf("Customer %d entering waiting room.\n", num);
// Wait for the barber chair to become free.
sem_wait(&barberChair);
// The chair is free so give up your spot in the
// waiting room.
sem_post(&waitingRoom);
// Wake up the barber...
printf("Customer %d waking the barber.\n", num);
sem_post(&barberPillow);
// Wait for the barber to finish cutting your hair.
sem_wait(&seatBelt);
// Give up the chair.
sem_post(&barberChair);
printf("Customer %d leaving barber shop.\n", num);
}
问题在while循环中
while(sem_trywait(&waitingRoom)){
printf("Semaphore is full you must wait!");
}
我不知道怎么用。谢谢您。
编辑1:
void *customer(void *number) {
int num = *(int *) number;
// Leave for the shop and take some random amount of
// time to arrive.
printf("Customer %d arrived at barber shop.\n", num);
if (sem_trywait(&waitingRoom) == 0) {
// Wait for space to open up in the waiting room...
sem_wait(&waitingRoom);
printf("Customer %d entering waiting room--------------------------------------------.\n", num);
// Wait for the barber chair to become free.
sem_wait(&barberChair);
// The chair is free so give up your spot in the
// waiting room.
sem_post(&waitingRoom);
// Wake up the barber...
printf("Customer %d waking the barber.\n", num);
sem_post(&barberPillow);
// Wait for the barber to finish cutting your hair.
sem_wait(&seatBelt);
// Give up the chair.
sem_post(&barberChair);
printf("Customer %d leaving barber shop.\n", num);
} else {
printf("leaving barber shop %d\n", num);
customer(&num);
//sem_wait(X);
}
}
最佳答案
首先是一个一般性的警告,我会把你的具体问题放低一点。不要使用sem_trywait
,除非您有非常具体的理由这样做,并且对信号量和锁有非常好的理解。这适用于所有的锁函数、互斥锁、rwlocks等。如果有一个“try”版本的锁函数,那么它适用于非常特殊的情况,这些情况不适用于99%的用户。sem_wait
将以最有效的方式等待信号量。在sem_trywait
上旋转while循环将实现与sem_wait
几乎相同的功能(但不是完全相同),只是这样做会非常低效地浪费CPU时间,并且可能会阻止其他人释放信号量。sem_trywait
和其他“尝试”锁定功能适用于无法等待锁的情况,您宁愿操作失败也不要等到锁可用。很少有应用程序有这样的需求。这可能发生在硬实时系统或一些非常复杂的锁定方案中,其中失败是避免锁排序问题的唯一方法。
大多数应用程序都没有这个问题。例如,您的示例代码根本没有这个问题。第一个可以满足你的需要。如果您只想在信号量被捕获时记录消息,那么您希望执行的操作如下:
if (sem_trywait(X) == 0) {
printf("semaphore acquired\n");
} else {
printf("need to wait for semaphore\n");
sem_wait(X);
}
代码的问题是,您首先尝试等待,然后再次等待,这是不正确的,因为如果trywait成功,则意味着它执行了与
sem_wait
相同的操作。关于c - 如何使用sem_trywait()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27294954/