我正在寻找一种方法来优化以下代码,用于我开发的开源项目,或者通过将繁重的工作转移到另一个线程来提高其性能。
void ProfilerCommunication::AddVisitPoint(ULONG uniqueId)
{
CScopedLock<CMutex> lock(m_mutexResults);
m_pVisitPoints->points[m_pVisitPoints->count].UniqueId = uniqueId;
if (++m_pVisitPoints->count == VP_BUFFER_SIZE)
{
SendVisitPoints();
m_pVisitPoints->count=0;
}
}
当调用每个访问点时,上述代码由OpenCover分析器(用 C++ 编写的 .NET 开源代码覆盖工具)使用。互斥体用于保护一些共享内存(在多个 32/64 位和 C++/C# 进程之间共享的 64K 块),当它向主机进程发出信号时,它会发出信号。显然,这对于每个仪表点来说都非常重,我想让影响更轻。
我正在考虑使用由上述方法推送到的队列和一个线程来弹出数据并填充共享内存。
问:我可以使用 C++ (Windows STL) 中的线程安全队列 - 还是我不想用另一个问题替换一个问题的无锁队列?人们认为我的方法合理吗?
编辑1:我刚刚在包含文件夹中找到concurrent_queue.h - 这可能是我的答案......?