Мне нужно разработать потокобезопасный регистратор. Мой регистратор должен иметь метод Log(), который просто ставит в очередь текст для регистрации. Также регистратор должен быть без блокировки, чтобы другие потоки могли регистрировать сообщения, не блокируя регистратор. Мне нужно разработать рабочий поток, который должен ожидать некоторого события синхронизации, а затем регистрировать все сообщения из очереди, используя стандартное ведение журнала .NET (это не потокобезопасно). Итак, что меня интересует, так это синхронизация рабочего потока и функции журнала. Ниже приведен эскиз класса, который я разработал. Я думаю, что я должен использовать здесь Monitor.Wait/Pulse или любые другие средства для приостановки и возобновления рабочего потока. Я не хочу тратить циклы процессора, когда нет работы для регистратора.
Скажем иначе: я хочу разработать регистратор, который не блокирует вызывающие потоки, которые его используют. У меня есть высокопроизводительная система - и это требование.
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
}
}
}