如何正确使用sem_timedwait()

时间:2016-05-03 17:40:53

标签: c time pthreads semaphore

我试图让我的程序中的线程停止,如果它不能在10秒后减少信号量(另一个线程可能或不能增加它) 我看到我可以使用sem_timedwait(),但我在网上找不到一个好的例子。 所以我只想替换它:

sem_wait(&full);
//go on with stuff

有这样的事情:

sem_timedwait(&full,someTimeStuffThatRepresents10Secs);
if(sem_timedwaitTookLongerThan10){
    pthread.exit(NULL);
}else{
    //do stuff
}

感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

/* Calculate relative interval as current time plus 10 seconds */

struct timespec ts;
if (clock_gettime(CLOCK_REALTIME, &ts) == -1)
{
    /* handle error */
    return -1;
}

ts.tv_sec += 10;
while ((s = sem_timedwait(&full, &ts)) == -1 && errno == EINTR)
               continue;       /* Restart if interrupted by handler */
/* Check what happened */
if (s == -1)
{
    if (errno == ETIMEDOUT)
        printf("sem_timedwait() timed out\n");
    else
        perror("sem_timedwait");
} else
        printf("sem_timedwait() succeeded\n");

Linux程序员手册在

上给出了详尽的示例
  

SEM_WAIT(3)

请在控制台中输入man sem_timedwait或访问文档online