我在谷歌上找不到这方面的任何信息,所以我在这里发帖希望有人能提供帮助......
我的问题是 Windows pthread 函数pthread_cond_timedwait()
。当指定的时间过去时,函数应该返回值 ETIMEDOUT。相反,在我的代码中,它的条件变量没有发出信号,它返回值 138 并且比预期的超时时间早得多,有时是立即执行。
所以我的问题是:这个错误 138 是什么?为什么超时没有完全过去?我用于线程的代码是:
int retcode = 0;
timeb tb;
ftime(&tb);
struct timespec timeout;
timeout.tv_sec = tb.time + 8;
timeout.tv_nsec = tb.millitm * 1000 * 1000;
pthread_mutex_lock(&mutex_);
retcode = pthread_cond_timedwait(&cond_, &mutex_, &timeout);
pthread_mutex_unlock(&mutex_);
if (retcode == ETIMEDOUT)
{
addLog("Timed-out. Sending request...", LOG_DEBUG);
}
else // Something happened
{
std::stringstream ss;
ss << "Thread interrupted (Error " << retcode << ")";
addLog(ss.str().c_str(), LOG_DEBUG);
}
我的绝对超时计算有问题吗?
只有这个线程和调用线程存在。调用者在创建后立即加入创建者,并正确等待它完成。目前,条件变量cond_
从未发出信号,但如果我尝试这样做,则pthread_cond_timedwait()
返回值 0 如预期的那样。即使此处未显示,两者cond_
和mutex_
都已正确初始化(如果我不这样做,我会收到 EINVAL 错误)。
同样遵循 pthread 代码,我找不到此错误。我只能找到一些return errno
可以产生它的东西,但我不知道138的含义。
如果有帮助,我正在使用带有 pthreads win32 v2.9.1 的 Visual Studio 2003。
谢谢,
RG