여러 스레드로 작업하는 경우 동기화를 피하기 어렵습니다. 다행히도 그리 어렵지 않습니다.
단일 프로세스의 경우 중요한 섹션이 주로 선택되는 경우가 많습니다. 빠르고 사용하기 쉽습니다. 단순화를 위해, 나는 초기화와 정리를 다루기 위해 보통 그것을 클래스로 감싼다.
잠금/잠금 해제 할 수있는 "자동 잠금"클래스를 사용하면 더 간단하게 만들 수 있습니다.
class CTkAutoLock
{
public:
CTkAutoLock(CTkCritSec &lock)
: m_lock(lock)
{
m_lock.Lock();
}
virtual ~CTkAutoLock()
{
m_lock.Unlock();
}
private:
CTkCritSec &m_lock;
};
어디서나 잠금을 설정하려는 위치에서 자동 잠금을 인스턴스화합니다. 기능이 끝나면 잠금이 해제됩니다. 또한 예외가있는 경우 자동으로 잠금이 해제됩니다 (예외 안전성 제공).
이제는 cmsg의 내용은 당신이 좋아하는 무엇이든 할 수있다
#include <queue>
#include <deque>
#include <functional>
#include <string>
struct CMsg
{
CMsg(const std::string &s, int n=1)
: sText(s), nPriority(n)
{
}
int nPriority;
std::string sText;
struct Compare : public std::binary_function<bool, const CMsg *, const CMsg *>
{
bool operator() (const CMsg *p0, const CMsg *p1)
{
return p0->nPriority < p1->nPriority;
}
};
};
class CMsgQueue :
private std::priority_queue<CMsg *, std::deque<CMsg *>, CMsg::Compare >
{
public:
void Push(CMsg *pJob)
{
CTkAutoLock lk(m_critSec);
push(pJob);
}
CMsg *Pop()
{
CTkAutoLock lk(m_critSec);
CMsg *pJob(NULL);
if (!Empty())
{
pJob = top();
pop();
}
return pJob;
}
bool Empty()
{
CTkAutoLock lk(m_critSec);
return empty();
}
private:
CTkCritSec m_critSec;
};
성병 우선 순위 큐에서 간단한 메시지 큐를 만들 수 있습니다. CMsgQue는 개인적으로에서 std :: priority_queue를 상속받습니다. 이를 통해 우리의 (동기화 된) 메소드를 거치지 않고 대기열에 대한 원시 액세스를 방지합니다.
각 스레드에 이와 같은 큐를 지정하면됩니다.
면책 조항 여기 코드는 설명의 요지를 빠르게 나타냅니다. 프로덕션 환경에서 사용하기 전에 오류가 있으며 검토 및 테스트가 필요할 수 있습니다.
감사합니다. Nikolai :) – IamIC