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

时间:2014-04-15 03:39:29

标签: c++ multithreading

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

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

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

2 个答案:

答案 0 :(得分:1)

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

此外,您声称自己没有任何互斥锁,但是您正在使用事件队列。该事件队列中有一个互斥锁。如果它足够快,你很可能在正确的地方使用互斥锁。

答案 1 :(得分:0)

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

所以这里的问题是线程B和线程C可能在同一块数据上工作,并且你不想考虑性能使用锁。

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

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