问题的新描述:
我目前在测试环境中运行我们的新数据采集软件。该软件有两个主线程。一个包含一个与硬件通信并将数据推送到双缓冲区的快速循环。每隔几秒钟,这个循环就会冻结 200 毫秒。我做了几次测试,但没有一个能让我弄清楚软件在等待什么。由于该软件相当复杂,并且测试环境也可能会干扰该软件,因此我需要一种工具/技术来测试记录器线程在被阻塞 200 毫秒时正在等待什么。什么工具对实现这一目标有用?
原始问题:
在我们的数据采集软件中,我们有两个提供主要功能的线程。一个线程负责从不同的传感器收集数据,第二个线程将数据以大块的形式保存到磁盘中。数据收集在双缓冲区中。它通常每个项目包含 100000 个字节,每秒最多收集 300 个项目。一个缓冲区用于在数据收集线程中写入,一个缓冲区用于在第二个线程中读取数据并将其保存到磁盘。如果已读取所有数据,则切换缓冲区。缓冲区的切换似乎是一个主要的性能问题。每次缓冲区切换时,数据收集线程阻塞大约 200 毫秒,这太长了。但是,偶尔会发生这种情况,切换速度要快得多,几乎不需要任何时间。(测试电脑:Windows 7 64 位,
我的猜测是,性能问题与内核之间交换的数据有关。只有当线程偶然在同一个核心上运行时,交换才会快得多。我考虑过设置线程关联掩码以强制两个线程在同一个核心上运行,但这也意味着我失去了真正的并行性。另一个想法是让缓冲区在切换之前收集更多数据,但这会大大降低数据显示的更新频率,因为它必须等待缓冲区切换才能访问新数据。
我的问题是:是否有一种技术可以将数据从一个线程移动到另一个不会干扰收集线程的线程?
编辑:双缓冲区实现为两个用作环形缓冲区的 std::vectors。一个 bool (int) 变量用于告诉哪个缓冲区是活动的写缓冲区。每次访问双缓冲区时,都会检查 bool 值以了解应该使用哪个向量。切换双缓冲区中的缓冲区仅意味着切换此布尔值。当然,在切换期间,所有读取和写入都被互斥锁阻止。我认为这个互斥锁不可能阻塞 200 毫秒。顺便说一句,每个开关事件的 200 毫秒是非常可重复的。