C++-将数据复制到2个不同线程的最快/可靠的方法
C++ - Fastest/reliable method of copying data to 2 different threads
假设我有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终止并获得一些可用内存。
- 方法重写线程C++中的概念
- 使用基类中的派生方法运行线程,而无需使用模板
- 将线程中的数据存储到全局容器的最佳方法?
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 如何将带有参数的方法传递给线程以执行?
- C++ POCO - 如何在不使用 run() 方法的情况下启动线程池上的线程?
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- C++中的多线程:连接线程的正确方法
- 使用包含互斥锁的类的方法实例化 cpp11 线程
- 如何在JNI中从线程内部调用JAVA方法
- 如何从另一个线程调用颤振引擎方法
- 在另一个线程上发出 QObject 信号的正确方法?
- 在C++线程内实现多个计时器的最安全方法
- C++ std::线程调用方法,从对象原因到调用此类的析构函数
- 将指针传递到另一个线程的正确方法
- 在另一个 QThread 上运行成员方法时,无法将事件发送到其他线程拥有的对象
- 解决方法:QPixmap:在GUI线程之外使用pixmap是不安全的
- CPP:如何使用需要指针的方法创建线程
- 初始化线程的正确方法
- 从另一个线程更新QT小部件的一种详细方法