gpt4 book ai didi

c++ - sem_timedwait 随机失败

转载 作者:行者123 更新时间:2023-11-28 00:35:44 29 4
gpt4 key购买 nike

我写了一个小类,封装了共享锁和共享信号量。这些类通过了我所有的单元测试,除了一个:大约 60% 的时间使用 sem_timedwait 锁定共享内存信号量失败。这是我的代码:

SharedLock::SharedLock(const SharedSemaphore& semaphore, unsigned int wait_ns) :
Succeeded(false),
Semaphore(semaphore)
{
timespec wait;
if(clock_gettime(CLOCK_REALTIME, &wait) < 0)
{
throw exception_ty(SHARED_LOCK_RUNTIME_ERROR,
"SharedLock::SharedLock(...) failed: clock_gettime(...) encountered an error.");
}

unsigned long ns = wait_ns % 1000000000;
wait.tv_sec += (wait_ns - ns) / 1000000000;
wait.tv_nsec += ns;
int result = sem_timedwait(const_cast<sem_t*>(Semaphore.Semaphore.get_data()), &wait);

if(result < 0 && errno != ETIMEDOUT)
{
throw_on_sem_wait();
}

else if(result == 0)
{
Succeeded = true;
}
}

我可以使用 sem_wait 和 sem_trywait 来锁定和解锁这个信号量而不会出现任何错误;只有 sem_timedwait 随机失败。当它失败时,它总是将 errno 设置为 EINVAL。我在 Ubuntu Linux 12.10(64 位)上运行这些测试。

谁能告诉我为什么会遇到这些问题,以及我该如何解决这些问题?

最佳答案

EINVAL 如果 sem 不是 livad 信号量,或者 abs_timeout.tv_nsecs 的值小于 0,或大于或等于 10 亿,则返回。

在你的情况下 sem 应该是有效的,所以可能的原因是 wait.tv_nsec 超过了 10 亿,因为代码 wait.tv_nsec += ns 看起来是可能的; 不检查值。

您可以出于调试目的打印它的值,看看它是否是根本原因。

关于c++ - sem_timedwait 随机失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21035021/

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