Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 跨线程共享读取资源_C++_Linux_Multithreading_Operating System_Cpu - Fatal编程技术网

C++ 跨线程共享读取资源

C++ 跨线程共享读取资源,c++,linux,multithreading,operating-system,cpu,C++,Linux,Multithreading,Operating System,Cpu,这是一个关于多线程代码中读取性能的问题 情况就是这样。我有数千个实体需要知道的大量数据才能做出反应。此数据会更改每个帧,因此我们可以将其称为帧数据 这些实体中的每一个都有一个需要在每一帧运行的函数,让我们调用它run()。函数run()需要经常读取(但从不写入)帧数据。我们还假设帧数据在堆中,因此在创建新线程时不会被克隆 这些实体可能都是在单个线程上按顺序运行的,或者如果运行此代码的平台对这些实体有利,则可以将这些实体批处理为多个pthread,或者在各自的pthread上运行 因此,基本上,每

这是一个关于多线程代码中读取性能的问题

情况就是这样。我有数千个实体需要知道的大量数据才能做出反应。此数据会更改每个帧,因此我们可以将其称为
帧数据

这些实体中的每一个都有一个需要在每一帧运行的函数,让我们调用它
run()
。函数run()需要经常读取(但从不写入)帧数据。我们还假设
帧数据
在堆中,因此在创建新线程时不会被克隆

这些实体可能都是在单个线程上按顺序运行的,或者如果运行此代码的平台对这些实体有利,则可以将这些实体批处理为多个pthread,或者在各自的pthread上运行

因此,基本上,每个帧
帧数据
都会得到更新,然后每个实体在任意线程上以任意顺序获得
run()

我意识到,无论发生什么情况,读取都将花费相同的时间,但我担心的是,线程在等待另一个线程完成
模拟数据的读取时会被阻塞。这是一个合理的担忧吗


不考虑复制的成本,为我创建的每个线程复制一份
模拟数据
对我来说是个好主意,还是多个线程读取此资源时CPU可以?如果
模拟数据
在堆栈上,这种情况会发生什么变化。

您似乎有一个经典的单写入器/多读取器队列。有几种同步策略,包括和

由于缓存的原因,拥有一个拷贝绝对是最好的策略。在现代体系结构中,队列条目将例如由第一个线程读入缓存。同一CPU上的后续线程将避免从RAM中重新读取内存。队列项的多个副本可能跨多个CPU存在于缓存中

线程将在CPU上进行时间切片,以便一次只运行一个线程。在读取相同数据时,线程不会像互斥锁一样在串行锁的意义上相互阻塞

为每个线程制作多个副本是个坏主意。即使数据完全相同,副本也会使缓存过时


堆栈不会跨线程共享。如果队列元素位于线程的本地堆栈上,则它是私有副本。如果队列元素是通过指向主线程堆栈的指针访问的,那么只有一个副本存在。让一个线程访问另一个线程的堆栈通常是一个很糟糕的想法,但也有可能是这样。

您介绍的模拟数据没有描述它是什么或它的属性