Mutex блокирует поток в проблеме производителя-потребителя - PullRequest
0 голосов
/ 13 января 2019

У меня есть фундаментальный вопрос, касающийся проблемы производителя. Пожалуйста, рассмотрите следующий псевдокод.

//  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. Это блокирует важные потоки, когда происходит операция записи журнала.

Разве это не то же самое, что запись журнала в файл с другими важными потоками. Я не вижу смысла в создании нового потока для записи журналов в файл, когда важные потоки все равно блокируются.
Любая помощь приветствуется.

1 Ответ

0 голосов
/ 13 января 2019

Вы можете разделить retrieveFromQueueAndWriteToFile на: retrieveFromQueue и writeLogToFile. Примерно так:

run()
{
    mutex.lock();  // Line A
    auto log = retrieveFromQueue();
    mutex.unlock();

    writeLogToFile(log); // this operation does not need a lock

}

Примечание: Если run вызывается только одним потоком в бесконечном цикле, блокируются только push и pop из очереди, часть операции записи в файл выполняется этим потоком без блокировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...