在多线程环境中,从std::queue获取是CPU密集型的 请看下面的多线程C++伪代码(没有C++ 11)< /P> 有无“writeToFile”或“SchedYield”没有太大区别 我正在低优先级线程上运行 由于上面的代码,整个进程由于CPU的大量使用而被终止 addToQueueFromManyThreads被应用程序广泛调用,因为每秒有大量消息要记录
在这一点上,我想知道我是否使用了正确的数据结构,我已经尝试了我所能做的一切,但没有选择。非常感谢您对可能发生的事情给予的任何帮助。run()中的逻辑有缺陷。。它有效地不间断地运行,反复检查队列中是否有要接收的消息。如果没有,它会做什么?它再次检查,微弱地希望一条新消息在最后一毫秒左右到达。这就是为什么你的CPU负载会很高。它将大部分时间花在锁定的互斥体上,阻止其他想要向队列添加新消息的执行线程锁定互斥体,这一事实也没有帮助 正确实现这一点的教科书解决方案只是使用一个条件变量,然后等待它。条件变量存在于C++11之前,在POSIX中可用。这将使执行线程进入睡眠状态,完全停止所有CPU活动,直到在向队列添加新消息后,另一个执行线程发出条件变量的信号。如果不使用条件变量,则无法修复此问题,因为没有其他实用的替代方案在多线程环境中,从std::queue获取是CPU密集型的 请看下面的多线程C++伪代码(没有C++ 11)< /P> 有无“writeToFile”或“SchedYield”没有太大区别 我正在低优先级线程上运行 由于上面的代码,整个进程由于CPU的大量使用而被终止 addToQueueFromManyThreads被应用程序广泛调用,因为每秒有大量消息要记录,c++,multithreading,queue,cpu-usage,c++98,C++,Multithreading,Queue,Cpu Usage,C++98,在这一点上,我想知道我是否使用了正确的数据结构,我已经尝试了我所能做的一切,但没有选择。非常感谢您对可能发生的事情给予的任何帮助。run()中的逻辑有缺陷。。它有效地不间断地运行,反复检查队列中是否有要接收的消息。如果没有,它会做什么?它再次检查,微弱地希望一条新消息在最后一毫秒左右到达。这就是为什么你的CPU负载会很高。它将大部分时间花在锁定的互斥体上,阻止其他想要向队列添加新消息的执行线程锁定互斥体,这一事实也没有帮助 正确实现这一点的教科书解决方案只是使用一个条件变量,然后等待它。条件变量
如何在每个C++教科书中解释一个条件变量,它包含执行线程和POSIX,在这里我将指导您获得更多的信息,以及示例,特别是因为所显示的代码是伪代码。为了理解和学习使用条件变量及其语义的正确方法,您应该花一些时间来复习本资料。不正确的使用不会有帮助,而且可能会使事情变得更糟。
run()中的逻辑有缺陷。它有效地不间断地运行,反复检查队列中是否有要接收的消息。如果没有,它会做什么?它再次检查,微弱地希望一条新消息在最后一毫秒左右到达。这就是为什么你的CPU负载会很高。它将大部分时间花在锁定的互斥体上,阻止其他想要向队列添加新消息的执行线程锁定互斥体,这一事实也没有帮助 正确实现这一点的教科书解决方案只是使用一个条件变量,然后等待它。条件变量存在于C++11之前,在POSIX中可用。这将使执行线程进入睡眠状态,完全停止所有CPU活动,直到在向队列添加新消息后,另一个执行线程发出条件变量的信号。如果不使用条件变量,则无法修复此问题,因为没有其他实用的替代方案如何在每个C++教科书中解释一个条件变量,它包含执行线程和POSIX,在这里我将指导您获得更多的信息,以及示例,特别是因为所显示的代码是伪代码。为了理解和学习使用条件变量及其语义的正确方法,您应该花一些时间来复习本资料。不正确的使用不会有帮助,而且可能会使事情变得更糟。
我注意到您的delay()
在run()
中超出了while循环。这似乎是个错误。但是除了使用条件变量而不是手动检查之外,您还运行了多少线程?数据输入的速度有多快?请尽可能提供编译代码。伪代码的用处要小得多。@metal,事实上,我也尝试过使用条件变量,但消息太快了,根本不重要。它会在一秒钟内发出50-60次信号。所以,我想我应该简化一下,看看到底发生了什么。我们有大约40个线程正在运行,它们正在推送到队列中。您有多少个处理器?40个线程听起来像是上下文切换的大量开销,这可能会使问题变得更糟,而不是增加吞吐量。条件变量而不是手动生成可以通过一次只激活一个等待线程来最小化上下文切换量。机器比较旧,处理能力也不太强。虽然我没有具体的细节。但是,仅仅使用条件变量是没有帮助的。我注意到您的delay()
在run()
中超出了while循环。这似乎是个错误。但是除了使用条件变量而不是手动检查之外,您还运行了多少线程?数据输入的速度有多快?请尽可能提供编译代码。伪代码的用处要小得多。@metal,事实上,我也尝试过使用条件变量,但消息太快了,根本不重要。它会在一秒钟内发出50-60次信号。所以,我想我应该简化一下,看看到底发生了什么。我们有大约40个线程正在运行,它们正在推送到队列中。您有多少个处理器?40个线程听起来像是上下文切换的大量开销,这可能会使问题变得更糟,而不是增加吞吐量。条件变量而不是手动生成可以通过一次只激活一个等待线程来最小化上下文切换量。机器比较旧,处理能力也不太强。不过我没有具体的细节。但是,仅仅使用条件变量是没有帮助的。我几乎建议看一看基于C++11条件变量的线程安全队列。将其翻译回POSIX应该是可能的。感谢您的回答,但我已经尝试使用条件变量,但消息流入速度太快了
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;
}