Я ищу способ оптимизировать следующий код для проекта с открытым исходным кодом, который я разрабатываю, или сделать его более производительным, перенеся тяжелую работу в другой поток.
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 (инструментом покрытия с открытым исходным кодом для .NET, написанным на C ++), когда вызывается каждая точка посещения.Мьютекс используется для защиты некоторой разделяемой памяти (блок 64 КБ, совместно используемый несколькими процессами 32/64 бит и C ++ / C #), когда он заполнен, он сигнализирует хост-процессу.Очевидно, что это довольно тяжело для каждой контрольно-измерительной точки, и я хотел бы сделать воздействие более легким.
Я имею в виду использование очереди, к которой подталкивается вышеуказанный метод, и потока для извлечения данных и заполненияобщая память.
Q.Есть ли потокобезопасная очередь в C ++ (Windows STL), которую я могу использовать - или очередь без блокировки, поскольку я не хотел бы заменять одну проблему другой?Считают ли люди мой подход разумным?
РЕДАКТИРОВАТЬ 1: Я только что нашел concurrent_queue.h в папке include - это может быть мой ответ ...?