如何应对速度过快的网络环路?

时间:2017-01-17 10:30:12

标签: c++ multithreading c++11 network-programming sleep

我有一个带有连接处理线程的程序,它有一个循环。问题是循环运行得太快,消耗100%CPU核心。

如果没有客户端(显然当有客户端时问题仍然存在),我尝试在最后放置std::this_thread::sleep_for(std::chrono::milliseconds(1));(或类似),它确实解决了CPU占用问题,但它也引起了响应的延迟新的联系。睡眠不可靠并且不能太小通常会导致> 1毫秒。如果睡眠很小,它无论如何都不会真正导致高效睡眠(1-3%的CPU内核消耗)。

处理它的好方法是什么?

1 个答案:

答案 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);

请参阅: