C++中使用
在C++03中,这种情况还算可以接受,因为该语言不支持多线程;它仅支持支持多线程的平台,这些平台提供了像POSIX
C++11还定义了新的时间工具,与非分解的
我是否遗漏了某些东西,或者这个任务仍然需要依赖于POSIX?
编辑:以下是一些解决方法的代码。它保持与提供
strftime
函数定义时间格式,需要一个“分解时间”记录struct tm
。然而,C和C++03语言没有提供线程安全的方法来获取此类记录;整个程序只有一个主struct tm
。在C++03中,这种情况还算可以接受,因为该语言不支持多线程;它仅支持支持多线程的平台,这些平台提供了像POSIX
localtime_r
这样的工具。C++11还定义了新的时间工具,与非分解的
time_t
类型进行交互,这正是用于重新初始化全局struct tm
的类型。但是,获取time_t
并不是问题所在。我是否遗漏了某些东西,或者这个任务仍然需要依赖于POSIX?
编辑:以下是一些解决方法的代码。它保持与提供
::localtime_r
的多线程环境兼容,并且在只提供std::localtime
的单线程环境下也可以使用。它也可以轻松地适应其他函数的检查,例如posix::localtime_r
或::localtime_s
等等。namespace query {
char localtime_r( ... );
struct has_localtime_r
{ enum { value = sizeof localtime_r( std::declval< std::time_t * >(), std::declval< std::tm * >() )
== sizeof( std::tm * ) }; };
template< bool available > struct safest_localtime {
static std::tm *call( std::time_t const *t, std::tm *r )
{ return localtime_r( t, r ); }
};
template<> struct safest_localtime< false > {
static std::tm *call( std::time_t const *t, std::tm *r )
{ return std::localtime( t ); }
};
}
std::tm *localtime( std::time_t const *t, std::tm *r )
{ return query::safest_localtime< query::has_localtime_r::value >().call( t, r ); }
localtime
放在一个使用互斥锁或其他轻量级锁的函数中?我不认为这里需要使用POSIX。 - Nicol Bolaslocaltime
的方法,这正是我建议告诉用户不要做的事情。我不能强制要求我的互斥锁成为localtime
函数的唯一锁 - 库的功能与此无关。无论如何,任何涉及互斥锁的方案都会是错误的解决方案,因为我的代码不是多线程的,只是线程安全的。 - Potatoswatter