如何处理过快的网络循环
How to deal with networking loops that are too fast?
我有一个程序,其连接处理线程具有循环。问题是循环运行太快并消耗 100% CPU 内核。
如果没有客户端,我尝试在末尾放置一个std::this_thread::sleep_for(std::chrono::milliseconds(1));
(或类似)(显然,当有客户端时问题仍然存在),它确实解决了 CPU 占用问题,但它也会延迟响应新连接。睡眠不可靠,不能太小,通常会导致> 1 毫秒。如果睡眠时间很短,它无论如何都不会真正导致高效的睡眠(1-3% 的 CPU 内核消耗)。
处理它的好方法是什么?
主动等待很少是一个好主意。 通常,将等待委托给系统并在事件发生时被唤醒是一种更好的方法。
在 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);
看:
pthread_cond_wait()
pthread_cond_signal()
pthread_cond_init()/pthread_cond_destroy()
相关文章:
- 如何循环打印顶点结构
- 我的神经网络不起作用 [XOR 问题]
- 如何在C++中从两个单独的for循环中添加两个数组
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 正在尝试了解输入验证循环
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 循环后如何继续阅读
- Ardunio UNO解决了多个重叠的定时器循环
- Eigen如何在容器循环中干净地附加矩阵
- 在某些循环内使用vector.push_back时出现分段错误
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 为什么我的for循环不能正确获取argv
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- while循环中while循环的时间复杂度是多少
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- CAFFE转发网络在for循环中不起作用
- 在 C++14 中的 for 循环中并行网络下载
- 如何处理过快的网络循环
- 如何从阻力网络中移除循环
- 如何在其他类的嵌套循环中获得主事件循环QCoreApplication,以实现网络操作