查询时间/周期是针对所有内核/线程的序列化请求还是并行请求?
Is querying time/cycles a serialized or a parallel request for all cores/threads?
假设有一个简单的"哪个线程首先完成循环"基准,
#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 类system_clock [时间-时钟.系统]
类 system_clock 的对象表示来自 系统范围的实时时钟。
系统范围的实时时钟,意味着所有进程检索相同的时间点。并且调用不应导致阻塞。
相关文章:
- 如何在C++中序列化结构数据
- 序列化,没有库的整数,得到奇怪的结果
- 如何知道QDataStream不能反序列化某些内容
- 如何使用Python从C++中读取谷物序列化数据
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 自定义对象的dlib序列化在gcc中失败
- C++boost序列化多态性问题
- 增强基于 XML class_id的反序列化
- 提升反序列化对象具有 nan 或 -nan 值
- 在 cpp 中的平面缓冲区中序列化对象
- 每次进行继承时都需要提升::序列化::base_object吗?
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 提升序列化 1:73 的向后兼容性问题
- 将 boost 序列化对象的 asio::streambuf 表示转换为 Beast 的 DynamicBody req.body()
- 为什么 nlohmann/json 序列化 "null" 而不是在 double 上"0"?
- 如何反序列化数组?
- 如何使用提升序列化?
- 序列化多晶型接口
- 查询时间/周期是针对所有内核/线程的序列化请求还是并行请求?