首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用sem_trywait()?

如何使用sem_trywait()?
EN

Stack Overflow用户
提问于 2014-12-04 13:12:20
回答 2查看 13.7K关注 0票数 0

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

我尝试了函数sem_trywait(),但它没有唤醒,我现在不知道为什么,你能帮我吗?

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

我希望使用sem_trywait()来检测,是信号量blocket:

代码语言:javascript
复制
 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);
}

问题在时间循环中。

代码语言:javascript
复制
while(sem_trywait(&waitingRoom)){
    printf("Semaphore is full you must wait!");
}

我不知道怎么用它。谢谢。

EDIT1:

代码语言:javascript
复制
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);
    }


}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-04 15:25:37

首先,一个一般性的警告,我会讲到你的确切问题下。不要使用sem_trywait,除非您有非常具体的理由这样做,并且对信号量和锁定有很好的理解。这适用于所有锁定函数、互斥锁、rwlock等。如果有一个“尝试”版本的锁函数,它就存在于不适用于99%的用户的非常特殊的情况下。

sem_wait将以最有效的方式等待信号量。您在sem_trywait周围旋转will循环将实现几乎(但不完全)与sem_wait相同的功能,只是这样做效率很低,浪费了CPU时间,并可能阻止其他人释放信号量。

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

大多数应用程序都没有这个问题。例如,您的示例代码根本没有这个问题。第一个sem_wait将满足您的需要。如果您只想在接收信号量时记录一条消息,那么您想要做的事情如下:

代码语言:javascript
复制
if (sem_trywait(X) == 0) {
    printf("semaphore acquired\n");
} else {
    printf("need to wait for semaphore\n");
    sem_wait(X);
}

代码的问题是,首先尝试等待,然后再等待,这是不正确的,因为如果尝试等待成功,就意味着它与sem_wait做了相同的事情。

票数 3
EN

Stack Overflow用户

发布于 2014-12-04 13:23:36

不要使用while循环进行测试。试着等待一次,检查结果。

代码语言:javascript
复制
result = sem_trywait(...);
if (result == -1) { 
    // Check one of: EAGAIN, EDEADLK, EINTR, EINVAL
}

然后决定循环,如果您需要等待更多。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27294954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档