互斥体在生产者-消费者问题中阻塞线程

时间:2019-01-13 15:33:18

标签: c++ mutex producer-consumer

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

//  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 :(得分:0)

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

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

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

}

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