c++ - sem_timedwait 随机失败

标签 c++ concurrency process posix

我写了一个小类,封装了共享锁和共享信号量。这些类通过了我所有的单元测试,除了一个:大约 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/

相关文章:

c++ - 为具有多重继承的一种类型设置默认构造函数

c++ - Qt/C++ 中的 ComboBox 默认值

Java:嵌套同步块(synchronized block)

java - 杀死进程和 System.exit(0) 之间的区别;

c++ - 如何从文件中读取编译器标志

c++ - 在 C++ 错误中创建类

java - volatile 如何使我的类线程安全?

c - 读取内存屏障如何在存在中断的情况下工作?

c# - 从作为 LocalSystem 运行的 WCF 托管服务以特定用户身份启动进程

c - 虚拟页面权限位和区域结构权限位之间的区别