生产者-消费者问题中的互斥锁阻塞线程
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被锁定,写入文件部分操作由该线程完成而不锁定。
我有一个关于生产者消费者问题的基本问题。请考虑以下伪代码。
// 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被锁定,写入文件部分操作由该线程完成而不锁定。