2

我在谷歌上找不到这方面的任何信息,所以我在这里发帖希望有人能提供帮助......

我的问题是 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

4

1 回答 1

1

也许这个答案会对某人有所帮助。

我遇到了同样的问题。pthread_cond_timedwait 返回错误 138 我翻遍了 pthread_win32 的所有源代码,但没有找到与错误代码 138 类似的任何内容。我下载了 pthread 的源代码,用 Visual Studio 2008 构建了它,并且......一切都很好!:(

这种行为的原因是预编译的 dll 是用 MSVC100 构建的,但我用 MSVC90 构建了我的应用程序。MSVC100 中的 ETIMEDOUT 为 138,但在 MSVC90 中为 10060。

就这样!这是Windows,兄弟!

于 2016-11-28T12:43:21.060 回答