我无法在Google上找到任何相关信息,因此我在此发帖,希望有人可以提供帮助......
我的问题在于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的含义。
如果它可以提供帮助,我使用的是Visual Studio 2003和pthreads win32 v2.9.1。
谢谢,
RG
答案 0 :(得分:1)
也许这个答案对某人有帮助。
我遇到了同样的问题。 pthread_cond_timedwait返回错误138 我翻找了pthread_win32的所有源代码,但没有发现类似于错误代码138的任何内容。 我下载了pthread的源代码,用Visual Studio 2008构建它......所有工作都很好! :(
此类行为的原因是预编译的dll是使用MSVC100构建的,但我使用MSVC90构建了我的应用程序。 MSVC100中的ETIMEDOUT为138,但在MSVC90中为10060。
多数民众赞成!它是Windows,兄弟!