Gio*_*ani 6 c++ multithreading clock
std::chrono::steady_clock跨线程保留单调属性吗?例如,假设我有以下程序.
#include <chrono>
#include <mutex>
#include <thread>
using namespace std;
using namespace chrono;
mutex m;
int i = 0;
void do_something(int &x) {
x += 1;
}
void f1() {
unique_lock<mutex> lock(m);
auto time = steady_clock::now();
do_something(i);
}
void f2() {
unique_lock<mutex> lock(m);
auto time = steady_clock::now();
do_something(i);
}
int main() {
thread t1(f1);
thread t2(f2);
t1.join();
t2.join();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我可以假设最后具有较小time值的线程(假设它们具有不同的值)i在另一个之前被修改并且另一个看到i它被第一个留下了吗?
标准[time.clock.steady]
...
static constexpr bool is_steady = true;
static time_point now() noexcept;
...
Run Code Online (Sandbox Code Playgroud)
is_steady必须在所有实现中都为true(即,如果OS等不具备,则该类不能与false一起存在),并且两个成员都独立于实例.
标准[time.clock.req]:
时钟要求
......
C1和C2表示时钟类型.t1和t2是C1 :: now()返回的值,其中返回t1的调用发生在(1.10)调用返回t2之前,并且这两个调用都发生在C1 :: time_-point :: max()之前.
...
C1 :: is_steady:如果t1 <= t2始终为真且时钟滴答之间的时间是常数,则为true,否则为false.
1.10部分包含:
多线程执行和数据竞争
...
评估A发生在评估B之前,如果:
A在B之前排序,或者
A线程在B之前发生
....
评估A线程发生在评估B之前如果
一个同步与B,或...
我不认为同步需要在这里复制(互斥量应该足以实现),
所以:是的,没关系.
| 归档时间: |
|
| 查看次数: |
797 次 |
| 最近记录: |