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

C++ - Fastest/reliable method of copying data to 2 different threads

本文关键字:方法 线程 数据 复制 2个 C++-      更新时间:2023-10-16

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

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

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

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

此外,您声称您没有任何互斥对象,但您使用的是事件队列。这个事件队列中有一个互斥体。如果它对你来说足够快,那么在正确的位置上的互斥体也很可能。

我不知道我是否完全理解这个问题,如果我错了,请纠正我。

因此,这里的问题是线程B和线程C可能处理同一块数据,并且考虑到性能,您不希望使用锁。

那么,为什么不在线程B和线程C之间添加DataPool层呢?这个DataPool将预先分配足够的内存,线程B将向它请求新的内存。完成后,线程B将指针传递给阻塞队列,线程C将开始处理该指针。一旦线程C完成,它将调用DataPool进行回收。

线程B可能会等待线程C,因为DataPool没有任何可用内存,每个人都在等待线程C调用DataPool释放内存。首先,您可以扩大数据池并测试最佳大小以避免出现问题。其次,如果线程C不那么重要,DataPool可以强制线程C终止并获得一些可用内存。