스레드 안전 로거를 디자인해야합니다. 내 로거에는 단순히 기록 할 텍스트를 대기시키는 Log() 메서드가 있어야합니다. 또한 로거는 잠금이 없어야하므로 다른 스레드가 로거를 잠그지 않고 메시지를 기록 할 수 있습니다. 일부 동기화 이벤트에 대해 을 대기해야하는 작업자 스레드를 디자인하고 표준 .NET 로깅 (스레드로부터 안전하지 않은)을 사용하여 큐에서 모든 메시지를 기록해야합니다. 그래서 내가 관심있는 것은 작업자 스레드와 로그 기능의 동기화이다. 아래는 내가 디자인 한 클래스의 스케치입니다. Monitor.Wait/Pulse를 여기 또는 다른 방법으로 사용하여 작업자 스레드를 일시 중지했다가 다시 시작해야한다고 생각합니다. 로거 작업이 없을 때 CPU주기를 소비하고 싶지 않습니다.잠금없는 스레드 안전 큐 - 조언이 필요합니다
다른 방법으로 말하자면 - 이 아닌 로거를 디자인하고 싶습니다. 사용하는 호출자 스레드는입니다. 필자는 고성능 시스템을 갖추고 있으며 이는 필수 요건입니다.
class MyLogger
{
// This is a lockfree queue - threads can directly enqueue and dequeue
private LockFreeQueue<String> _logQueue;
// worker thread
Thread _workerThread;
bool _IsRunning = true;
// this function is used by other threads to queue log messages
public void Log(String text)
{
_logQueue.Enqueue(text);
}
// this is worker thread function
private void ThreadRoutine()
{
while(IsRunning)
{
// do something here
}
}
}
여기 내 요구 사항은 고성능 Windows 서비스가 있기 때문에 비 차단 로깅을 구현하는 것입니다. –
하지만 어떻게 로거 스레드에 대한 차단을 구현할 예정입니까? 차단 오버 헤드는 Monitor를 사용하는 것보다 훨씬 큽니다. – wj32
캡틴, 나는 우리가 사물의 명명에 대해서만 동의한다고 생각합니다. –