c++ - 查询时间/周期是针对所有核心/线程的序列化请求还是并行请求?

标签 c++ system-clock

假设有一个简单的“哪个线程先完成循环”基准,

#include<thread>
#include<iostream>
#include<mutex>

int main()
{
    std::mutex m;

    std::thread t1([&](){
        auto c1=clock();
        for(int i=0;i<1000000;i++){ /* some unremovable logic here */  }
        auto c2=clock();

        std::lock_guard<std::mutex> g(m);
        std::cout<<"t1:  "<<c2-c1<<"  "<<std::endl;
    });

    std::thread t2([&](){
        auto c1=clock();
        for(int i=0;i<1000000;i++){ /* some unremovable logic here */  }
        auto c2=clock();

        std::lock_guard<std::mutex> g(m);
        std::cout<<"t2:  "<<c2-c1<<"  "<<std::endl;
    });


    t1.join();
    t2.join();

    return 0;
}

我们能否相信 clock() 或任何其他时间/时钟请求函数不会在线程之间序列化并始终独立,以便测量它不会改变线程完成工作的顺序?

如果整个 CPU 有单个时钟周期计数器,C++ 如何对每个线程进行计数?如果多个线程同时查询它是否只是广播相同的数据?还是将后面的微操作中的操作序列化,一次服务一个线程?

以上代码编译并给出这个结果(使用if(t1.joinable())if(t2.joinable())):

t1:  2  
t2:  3 

这是否意味着线程 1 绝对首先完成,或者它实际上稍后完成但首先为其请求时钟,以便线程 2 出现滞后?

不检查它们是否可连接:

t1:  1
t2:  1

最佳答案

std::chrono::system_clock 标准:

23.17.7.1 Class system_clock [time.clock.system]

Objects of class system_clock represent wall clock time from the system-wide realtime clock.

系统范围的实时时钟,意味着所有进程检索相同的时间点。并且调用不应导致阻塞。

关于c++ - 查询时间/周期是针对所有核心/线程的序列化请求还是并行请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57947545/

相关文章:

c - Linux 上精确的进程间计时器

java - 可靠的跨平台方式获取Java中的方法时间

引用下面定义的结构的 C++ 头文件

c++ - #include <boost/chrono.hpp> 导致无法解析的外部符号,使用了 bcp

c++ - 如何从另一个命名空间中显式特化函数模板?

iphone - 可以在 iPhone 的状态栏中添加另一个时钟吗?

Android - 获取当前时间而不依赖于设备的时钟

c++ - rand_r 不在范围内,gcc mingw 在 Windows 上的 cygwin 下

c++ - 如何正确地从nalgebra::Matrix转换为Eigen::MatrixXf?

C: 为什么当我的处理器速度是 3.10GHz 时 CLOCKS_PER_SEC 打印 1000