У меня есть фундаментальный вопрос, касающийся проблемы производителя. Пожалуйста, рассмотрите следующий псевдокод.
// Consumer. This is in the thread I created for asynchronous log writing
// so that I don't block the important threads with my silly log-writing
// operation
run()
{
mutex.lock(); // Line A
retrieveFromQueueAndWriteToFile();
mutex.unlock();
}
// producer. This function gets log messages from 'x' number of threads
add( string mylog )
{
mutex.lock(); // Line B, consider internal call to pthread_mutex_lock
Queue.push(mylog);
mutex.lock();
}
Когда в функции потребителя выполняется запись журнала, блокировка мьютекса сохраняется там. Таким образом, при поступлении нового журнала в строке B блокировка мьютекса не может быть получена в функции add. Это блокирует важные потоки, когда происходит операция записи журнала.
Разве это не то же самое, что запись журнала в файл с другими важными потоками. Я не вижу смысла в создании нового потока для записи журналов в файл, когда важные потоки все равно блокируются.
Любая помощь приветствуется.