生产者-消费者问题中的互斥锁阻塞线程

Mutex blocking the thread in a producer-consumer problem

我有一个关于生产者消费者问题的基本问题。请考虑以下伪代码。

//  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函数中无法获取到互斥锁。这会在日志写入操作发生时阻塞重要的线程。

这和其他重要线程自己写日志到文件不一样吗。当重要线程无论如何都被阻塞时,我看不出创建一个新线程将日志写入文件有什么意义。
任何帮助表示赞赏。

您可以将 retrieveFromQueueAndWriteToFile 拆分为:retrieveFromQueue 和 writeLogToFile。 像这样:

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

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

}

注意: 如果运行在一个无限循环中只被一个线程调用,只有队列中的push和pop被锁定,写入文件部分操作由该线程完成而不锁定。