timed_mutex将无法在Cygwin 4.8.2下编译(命名空间'std'中的'timed_mutex'未命名类型)

时间:2014-07-29 12:52:30

标签: multithreading gcc c++11 cygwin mutex

我的档案test8.cpp

#include<thread>
#include<mutex>
#include<chrono>

std::mutex mutex;
std::timed_mutex timed_mutex;

编译此代码时

g++ -std=c++11 -pthread -c test8.cpp
它告诉我

  名称空间'std'中的

timed_mutex未命名类型

我在Cygwin64下编译,gcc版本4.8.2

screenshot

=============================================== ===================

<@> @Jonathan Wakely

enter image description here

1 个答案:

答案 0 :(得分:2)

timed_mutex类型仅在平台支持时定义。 GCC&#39; <mutex>中的预处理器条件是:

#ifdef _GLIBCXX_USE_C99_STDINT_TR1

如果平台定义了可用的<stdint.h>标头,则定义

#if _GTHREAD_USE_MUTEX_TIMEDLOCK
如果通过_POSIX_TIMEOUTS标头将宏<unistd.h>定义为正值,则定义

如果未定义第一个宏,那么您也无法使用std::mutex,因此似乎只有第二个宏未定义,这意味着Cygwin的Pthreads实现不会支持超时功能。

用于检查超时功能的测试类似于:

#include <unistd.h>
// In case of POSIX threads check _POSIX_TIMEOUTS.
#if (defined(_PTHREADS) \
    && (!defined(_POSIX_TIMEOUTS) || _POSIX_TIMEOUTS <= 0))
#error
#endif
int main() { }

你可以尝试在Cygwin上编译它,并自己检查宏。如果Cygwin确实支持超时功能,请report a GCC bug,以便我们可以timed_mutex使用Cygwin。

修改:对于GCC 6,我为未定义_POSIX_TIMEOUTS的平台添加了alternative implementation of std::timed_mutex。我不知道这对Cygwin是否有帮助。