gpt4 book ai didi

c - 如何使用 sem_trywait()?

转载 作者:太空宇宙 更新时间:2023-11-04 07:12:28 25 4
gpt4 key购买 nike

如何测试信号量是否被阻塞?

我尝试了函数 sem_trywait() 但它不起作用,我现在不知道为什么,你能帮帮我吗?

示例在这里(使用信号量解决理发师 sleep 问题的示例程序。):http://users.dickinson.edu/~braught/courses/cs354s00/classes/code/SleepBarber.src.html

我想用sem_trywait()检测,是semaphore blocket:

 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 除非您有非常具体的理由这样做,并且对信号量和锁定有很好的理解。这适用于所有锁定功能、互斥体、rwlock 等。如果有锁定功能的“尝试”版本,它会用于非常特殊的情况,但不适用于 99% 的用户。

sem_wait 将以最有效的方式等待信号量。你在 while 循环中旋转 sem_trywait 将实现几乎(但不完全)与 sem_wait 相同的事情,除了你会非常低效地浪费 CPU 时间并可能阻塞其他人从释放信号量。

sem_trywait 和其他“尝试”锁定函数适用于您无法等待锁定并且宁愿操作失败也不愿等到锁定可用的情况。很少有应用程序实际上有这样的要求。这可能发生在硬实时系统或一些非常复杂的锁定方案中,其中失败是避免锁定排序问题的唯一方法。

大多数应用程序没有这个问题。例如,您的示例代码根本没有这个问题。第一个 sem_wait 将执行您需要的操作。如果你只想在信号量被占用时记录一条消息,你想做的是这样的:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com