나는 개발 한 오픈 소스 프로젝트에 대해 다음 코드를 최적화하거나 무거운 작업을 다른 스레드로 옮겨 더 성능을 향상시킬 방법을 찾고있다.스레드 안전 큐가 좋은 접근 방법입니까?
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 블록)를 보호하는 데 사용됩니다. 분명히 이것은 각 계측 포인트에 대해 상당히 무거 우므로 영향을 더 가볍게 만들고 싶습니다.
위의 방법으로 푸시 된 큐와 데이터를 팝하고 공유 메모리를 채우는 스레드를 사용하려고합니다.
Q. 사용할 수있는 C++ (Windows STL)에 스레드 안전 큐가 있습니까? 또는 하나의 큐를 다른 큐로 대체하지 않으려면 잠금이 필요없는 큐가 있습니까? 사람들은 내 접근 방식을 합리적으로 생각합니까?
편집 1 : 난 그냥 포함 폴더에 concurrent_queue.h을 발견했다 -이 내 대답이 될 수 ...?
같은 것은이 없습니다 대기열에서 여러 작성자와 여러 독자가있는 경우 안전 잠금 대기열을 잠글 수 있습니다. 그러나 단일 독자와 단일 작가가있는 경우 간단하게 안전하게 밟을 수 있으며 대부분의 구현에는이 규칙이 적용됩니다. –
[허브 셔터의 대기 시간 구현] (http://drdobbs.com/cpp/212201163) (기사에 액세스하려면 무료 계정을 만들어야 함)을 확인하십시오. 그것은 원자 변수를 사용합니다. –
concurrent_queue를 발견 했으므로 VS2010에 있습니까? – RedX