【发布时间】:2020-08-07 12:54:57
【问题描述】:
请看下面的多线程 C++ 伪代码。(没有 C++11)
Mutex mtx;
addToQueueFromManyThreads()
{
mtx.lock;
pushTowriteQueue();
mtx.unLock();
}
run()
{
std::string nextMessage = fetchNext();
while ( !nextMessage.empty() )
{
// writeToFile( nextMessage );
// (void)SchedYield();
nextMessage = fetchNext();
}
delay( 25 ms );
}
std::string CTraceFileWriterThread::fetchNext()
{
std::string message;
mtx.lock;
if( !writeQueue.empty() )
{
message = writeQueue.front();
writeQueue.pop();
}
mtx.unLock();
return message;
}
- 使用或不使用“writeToFile”或“SchedYield”没有太大区别。
- 我在低优先级线程上运行
- 由于上面的代码导致CPU占用过多,整个进程被杀死
- addToQueueFromManyThreads 被应用程序广泛调用,因为每秒要记录大量消息
此时,我想知道我是否使用了正确的数据结构,并且我已经尽我所能尝试了所有选项。感谢您对可能发生的事情的任何帮助。
【问题讨论】:
-
我注意到您的
delay()在run()的while 循环之外。这似乎是一个错误。但是除了使用条件变量而不是手动检查之外,您正在运行多少个线程?数据传入的速度有多快? -
请尽可能提供编译代码。伪代码用处不大。
-
@metal ,事实上我也尝试过使用条件变量,但消息太快了,这并不重要。它会在一秒钟内发出 50-60 次信号。所以,我想我会简化,看看到底发生了什么。我们有大约 40 个正在运行的线程正在推送到队列
-
您有多少个处理器? 40 个线程听起来对于上下文切换来说开销很大,这可能会使问题变得更糟,而不是给你更多的吞吐量。条件变量而不是手动让步可以通过一次只激活一个等待线程来最小化上下文切换的数量。
-
机器老旧,处理能力不大。虽然我没有具体细节。但是,仅仅有条件变量是没有帮助的。
标签: c++ multithreading queue cpu-usage c++98