关于生产者消费者问题,我有一个基本问题。请考虑以下伪代码。
// 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函数中获得互斥锁。当日志写入操作发生时,这会阻塞重要线程。
这与使用其他重要线程本身将日志写入文件不同吗?当重要线程始终被阻止时,我看不出创建新线程将日志写入文件的意义。
任何帮助表示赞赏。
答案 0 :(得分:0)
您可以将retrieveFromQueueAndWriteToFile拆分为:retrieveFromQueue和writeLogToFile。 像这样:
run()
{
mutex.lock(); // Line A
auto log = retrieveFromQueue();
mutex.unlock();
writeLogToFile(log); // this operation does not need a lock
}
注意: 如果运行仅在无限循环中被一个线程调用,则只有队列中的推入和弹出操作被锁定,操作的写文件部分将由该线程完成,而不会被锁定。