多线程 – timed_mutex不会在Cygwin 4.8.2下编译(命名空间’std’中的’timed_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

它告诉我

timed_mutex in namespace ‘std’ does not name a type

我在Cygwin64下编译,gcc版本4.8.2

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

@Jonathan Wakely

最佳答案 仅当平台支持时才定义timed_mutex类型. GCC< mutex>中的预处理器条件.是:

#ifdef _GLIBCXX_USE_C99_STDINT_TR1

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

#if _GTHREAD_USE_MUTEX_TIMEDLOCK

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

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

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

#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是否有帮助.

点赞