我有一个带有连接处理线程的程序,它有一个循环。问题是循环运行得太快,消耗100%CPU核心。
如果没有客户端(显然当有客户端时问题仍然存在),我尝试在最后放置std::this_thread::sleep_for(std::chrono::milliseconds(1));
(或类似),它确实解决了CPU占用问题,但它也引起了响应的延迟新的联系。睡眠不可靠并且不能太小通常会导致> 1毫秒。如果睡眠很小,它无论如何都不会真正导致高效睡眠(1-3%的CPU内核消耗)。
处理它的好方法是什么?
答案 0 :(得分:2)
积极等待很少是一个好主意。通常,这是将等待委托给系统并在事件发生时被唤醒的更好方法。
在Linux系统上,poll()
正是这样做的:
#include <poll.h>
// ...
::poll(&fds, nfds, timeout);
在timeout
的任何文件描述符上发生事件的等待(阻止)fds
毫秒。
作为不相关文件描述符案例的替代方案,我使用pthread_cond_wait()
和pthread_cond_signal()
。那些使用互斥和条件的工作:
pthread_cond_wait(&cond, &mutex)
解锁mutex
并立即将线程置于睡眠状态,直到cond
符合(发出信号),然后重新获取互斥锁。
pthread_cond_signal(&cond)
向cond
等待条件可能已更改的所有线程发出信号。
典型用法是:
worker thread:
::pthread_mutex_lock(&mutex);
while (condition == false) {
::pthread_cond_wait(&cond, &mutex); // passive wait
}
// this part is only invoked when:
// - condition is true
// - mutex has been acquired
::pthread_mutex_unlock(&mutex);
thread handling connection/deconnection:
::pthread_mutex_lock(&mutex);
// add/remove clients
::pthread_cond_signal(&cond);
::pthread_mutex_unlock(&mutex);
请参阅: