gpt4 book ai didi

c++ - 跨线程共享读资源

转载 作者:太空狗 更新时间:2023-10-29 12:39:30 27 4
gpt4 key购买 nike

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

情况是这样的。我有大量数据,几千个实体需要知道这些数据才能使用react。此数据会更改每一帧,因此我们将其称为 frame data

这些实体中的每一个都有一个需要在每一帧运行的函数,我们称之为 run()。函数 run() 需要频繁读取(但从不写入)帧数据。我们还假设 frame data 在堆中,因此在创建新线程时不会被克隆。

这些实体可能全部在单个线程上按顺序run(),或者如果运行此代码的平台有益,则实体可能被分批到多个 pthread 或每个 run() 在他们自己的 pthread 上。

因此,基本上每一帧 frame data 都会更新,然后每个实体都会在任意线程上以任意顺序获取 run()

我知道无论如何读取都将花费相同的时间,但我担心的是线程在等待另一个线程完成读取模拟数据时被阻塞。这是一个合理的担忧吗?

忽略复制成本,为我创建的每个线程复制一份模拟数据 对我来说是个好主意吗?或者 CPU 是否可以让多个线程读取此资源?如果 模拟数据 在堆栈上,这将如何改变。

最佳答案

您似乎有一个经典的单写入器/多读取器队列。有一些同步策略包括 RW-lockCircular Ring Buffers

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

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

为每个线程制作多个拷贝不是一个好主意。即使数据完全相同,拷贝也会使缓存过时。

堆栈不跨线程共享。如果队列元素在线程的本地堆栈上,则它是私有(private)拷贝。如果通过指向主线程堆栈的指针访问队列元素,则只会存在一个拷贝。然而,让一个线程访问另一个线程的堆栈通常是一个糟糕的想法 race conditions有可能。

关于c++ - 跨线程共享读资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52377877/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com