gpt4 book ai didi

c - 如何为 sem_timedwait 正确设置 timespec 以防止 EINVAL 错误

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

我正在尝试使用 sem_timedwait() 重复锁定和解锁信号量。基于示例 here ,我通过以下方式将我的结构 timespec 设置为 20 毫秒超时:

sem_t semaphore;  //initialized somewhere else

void waitForSomething ()
{
int ret;
struct timespec ts;

if (clock_gettime(CLOCK_REALTIME, &ts) == -1)
{
//throw error
}
ts.tv_nsec += 20000000; //timeout of 20 msec

while ((ret = sem_timedwait(&semaphore, &ts)) == -1 && errno == EINTR)
continue;

if (ret == -1 && errno != ETIMEDOUT) {
//flag error
} else {
//do something
}

return;
}

使用上面的代码,我的程序在运行一段时间后会一直失败,并显示 EINVAL 错误代码。调试后我意识到失败是因为 ts.tv_nsec 在一段时间后超过 1000000000。我目前的解决方法如下:

sem_t semaphore;  //initialized somewhere else

void waitForSomething ()
{
int ret;
struct timespec ts;

if (clock_gettime(CLOCK_REALTIME, &ts) == -1)
{
//throw error
}
if (ts.tv_nsec > 979999999) {
ts.tv_sec += 60;
ts.tv_nsec = (ts.tv_nsec + 20000000) % 1000000000;
} else {
ts.tv_nsec += 20000000;
}

while ((ret = sem_timedwait(&semaphore, &ts)) == -1 && errno == EINTR)
continue;

if (ret == -1 && errno != ETIMEDOUT) {
//throw error
} else {
// do something
}
return;
}

我想知道 - 是否有更好的方法可以做到这一点而不必自己直接调整 timespec 值?

最佳答案

据我所知,您需要标准化一个timespec将间隔添加到 tv_nsec 后结构正确.

您可以做的一件事是:

ts.tv_nsec += 20000000;
ts.tv_sec += ts.tv_nsec / 1000000000;
ts.tv_nsec %= 1000000000;

在 Linux 内核中,您可以使用 set_normalized_timespec()为您执行规范化。引用here .

关于c - 如何为 sem_timedwait 正确设置 timespec 以防止 EINVAL 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25254392/

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