1

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

#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())and if(t2.joinable())):

t1:  2  
t2:  3 

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

不检查它们是否可加入:

t1:  1
t2:  1
4

1 回答 1

1

std::chrono::system_clock标准:

23.17.7.1 类 system_clock [time.clock.system]

system_clock 类的对象表示来自系统范围实时时钟的挂钟时间。

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

于 2019-09-15T20:09:28.997 回答