在此代码示例中,.push()是否失败或等待锁定?

时间:2013-03-10 05:08:21

标签: c++ thread-safety locking websocket queue

哇,我希望在开始我的c ++ websocket冒险之前,我已经知道我的c ++英雄https://github.com/zaphoyd/websocketpp/blob/experimental/examples/broadcast_server/broadcast_server.cpp撰写的这个页面https://stackoverflow.com/users/1047661/zaphoyd。那里有很多课程。

如果我正确地阅读它(这是一个拉伸大声笑),它看起来像连接和消息发送&收据都是在一个线程中处理的(不能等到他的“多线程”或者其他任何调用,因为他在这个基本的例子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()只是等待释放锁?

1 个答案:

答案 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()之间发生阻塞。