簡體   English   中英

sem_timedwait隨機失敗

[英]sem_timedwait Fails at Random

我編寫了一個小類,其中封裝了共享鎖和共享信號燈。 這些類通過了我所有的單元測試,除了以下一項:通過sem_timedwait鎖定共享內存信號量的時間大約有60%失敗。 這是我的代碼:

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位)上運行這些測試。

誰能說出我為什么遇到這些問題,以及如何解決這些問題?

如果sem不是livad信號量,或者abs_timeout.tv_nsecs的值小於0或大於或等於10億,則返回EINVAL

在您的情況下,sem應該是有效的,因此可能的原因是wait.tv_nsec超過了10億,因為代碼wait.tv_nsec += ns; 不檢查該值。

您可以打印其值以進行調試,以查看其是否是根本原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM