【发布时间】:2018-06-14 20:01:32
【问题描述】:
小问题
直到并包括 C++17,C++ 都没有提供线程安全的方法来获取当前时间或日期。这会在 C++20 中修复吗?
长问题
获取当前时间和日期的唯一可移植方法是使用 std::gmtime 或 std::localtime 函数。 C 早期的残余,这些函数将自实现定义的纪元以来的给定时间转换为日历时间(例如,1515153600 转换为 2018 年 1 月 5 日星期五 12:00:00 GMT)。然而,唯一的缺点是这些函数返回一个指向内部静态变量的指针并且不是线程安全的。更糟糕的是,这个静态变量可能被所有相关函数共享,例如 std::gmtime、std::localtime 和 std::ctime,并且可能在每次调用这些函数时被覆盖。因此,如果您正在使用线程并希望定期检查您面临数据竞争和未定义行为的风险。
显然当前的标准在这方面被打破了。 C++ 标准委员会是否有任何努力来解决这种情况?这有多大可能被包含在 C++20 中?
【问题讨论】:
-
关于chrono解决方案,霍华德的
<date>提案进展顺利。 -
我不明白添加线程安全时间函数将如何解决您的问题“但是现在您必须确保代码的每一位都实际通过互斥体包装器。如果没有”你可能会再次遇到数据竞争,从而导致未定义的行为。如果你在编码工作分成团队的大型项目中编码,你必须不断提醒每个人他们不应该(!)使用 C++ 标准提供的功能,但请改用您自己的包装器(或冒未定义行为的风险)。”您仍然必须告诉人们不要使用非线程安全函数。
-
@NicolBolas 是的。我的观点是,当这是固定的编码人员可以使用 C++ 标准提供的线程安全函数,并且在线程环境中没有理由不这样做。当然,他们仍然可以朝自己的脚开枪,但现在他们有一个标准提供的选项不来朝自己的脚开枪。让 C++ 标准提供这些函数还有一个额外的好处,那就是它可以在内部实现而无需任何锁。
-
#2 是我的提议的目标:open-std.org/jtc1/sc22/wg21/docs/papers/2017/…
-
在我写这篇文章时,有 3 票接近。如果关闭,我在此承诺投票重新开放。如果其他人愿意,我鼓励他们发表同样的评论。
标签: c++ date datetime time c++20