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上进行时间切片,以便一次只运行一个线程。在读取相同数据时,线程不会像互斥锁一样在串行锁的意义上相互阻塞
为每个线程制作多个副本是个坏主意。即使数据完全相同,副本也会使缓存过时
堆栈不会跨线程共享。如果队列元素位于线程的本地堆栈上,则它是私有副本。如果队列元素是通过指向主线程堆栈的指针访问的,那么只有一个副本存在。让一个线程访问另一个线程的堆栈通常是一个很糟糕的想法,但也有可能是这样。您介绍的模拟数据没有描述它是什么或它的属性