如果我正确地阅读它(这是一个拉伸大声笑),它看起来像连接和消息发送&收据都是在一个线程中处理的(不能等到他的“多线程”或者其他任何调用,因为他在这个基本的例子http://www.zaphoyd.com/websocketpp/manual/common-patterns/server-initiated-messages中说WebSocket++ handlers block core networking functions. While this program is running its send loop in on_message, no new connections are being processed and no new messages are being received.
)和一个单独的线程{{ 1}}设置为实际处理消息,而主websocket ++线程只是向队列添加必要的信息。
请清除我缺乏的知识:如果boost::thread(bind(&broadcast_server::process_messages,&server));
与链接中的此部分代码同时发生,.push()
是否会失败
while(m_actions.empty()) {
m_action_cond.wait(lock);
}
action a = m_actions.front();
m_actions.pop();
lock.unlock();
或.push()
只是等待释放锁?
答案 0 :(得分:1)
std::queue<T>
对自己的线程一无所知;但是,在链接的代码中,对push
的所有调用都包含如下:
boost::unique_lock<boost::mutex> lock(m_action_lock);
//std::cout << "on_open" << std::endl;
m_actions.push(action(SUBSCRIBE,hdl));
lock.unlock();
m_action_cond.notify_one();
上面lock
对象的构造函数在内部调用m_action_lock.lock()
,它会一直阻塞,直到释放锁。
请注意,您在问题中粘贴的代码中的m_action_cond.wait(lock)
会在等待条件时解锁,并在唤醒后再次获取锁定(由于来自其他线程的信号,或possibly spuriously),因此它不会阻止生产者(执行push
)线程在等待时获取锁定:它只在唤醒和调用lock.unlock()
之间发生阻塞。