C++ - 将数据复制到 2 个不同线程的最快/可靠方法

标签 c++ multithreading

假设我有 3 个线程:A、B 和 C。线程 B 是一个关键线程,需要尽可能快,而其他两个线程则不那么重要。出于性能原因,我也没有使用任何互斥量。

我在线程 A 中收到一个对象的更新。它是一个在堆上分配的对象。线程 A 通过将事件发布到线程 B 的事件队列来将此数据传输到线程 B。线程 B 将通过清除旧内存并将指针重置为新内存来更新其对象拷贝。现在涉及到第 3 个线程(线程 C),每当线程 A 收到更新时,它也需要此数据。

如果我尝试将此数据从线程 B 传输到线程 C,那么理论上,线程 B 可能会在线程 C 正在处理该内存块的同时清除旧内存(这将导致竞争条件) .如果线程 C 正在处理一组旧数据,那是可以的。我只是想防止竞争条件。那么在那种情况下,我是否应该让线程 A 创建 2 个数据拷贝(一个用于线程 B,一个用于线程 C)并向每个拷贝发布一个事件?我不想在线程 B 中创建拷贝,因为该线程需要尽可能快。

最佳答案

我不是 100% 确定问题是什么。如果是关于内存管理(即何时释放内存),只需使用 shared_ptr(C++11 或 boost)。然后最后一个摆脱指针的线程将释放内存。

此外,您声称您没有任何互斥量,但您正在使用事件队列。该事件队列中有一个互斥锁。如果它对您来说足够快,很可能在正确位置的互斥量也能。

关于C++ - 将数据复制到 2 个不同线程的最快/可靠方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23074255/

相关文章:

c++ - 是否可以创建模板别名?

java - 线程中出现异常 "JavaFX Application Thread"java.lang.OutOfMemoryError : Java heap space

java - Future.get() 不返回

不阻塞主程序的循环数据读取(如 1Wire DS18B20 温度)

java - Netty,如何通过所有处理程序存储数据

c++ - 如何卸载高度依赖于正确异常处理的计算繁重的任务?

c++ - 给定 IR 文件时,如何使 LLVM opt 输出 IR 文件?

c++ - 重新加载未定义的行为和序列点

c++ - 为什么链表重新排序失败?

c++ - 如何通过 g++-arm-linux-gnueabihf 为 Arm 构建 Qt?