0

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

如果我没看错(这是一个延伸的哈哈),看起来连接和消息发送和接收都是在一个线程中处理的(不能等到他“多线程”或者他所说的任何东西)在这个基本示例http://www.zaphoyd.com/websocketpp/manual/common-patterns/server-initiated-messagesWebSocket++ 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.)并设置了一个单独的线程boost::thread(bind(&broadcast_server::process_messages,&server));来实际处理消息,而主 websocket++ 线程只是添加到排队必要的信息。

知识不足请大家多多指教:.push()如果和链接中这一段代码同时发生会不会失败

while(m_actions.empty()) {
    m_action_cond.wait(lock);
}

action a = m_actions.front();
m_actions.pop();

lock.unlock();

还是.push()只是等待锁被释放?

4

1 回答 1

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()which 阻塞直到锁被释放。

请注意m_action_cond.wait(lock),在您粘贴在问题中的代码中,在等待条件时解锁锁,并在它被唤醒后再次获取锁(由于来自另一个线程的信号,或者可能是虚假的),所以它不会'不要阻止生产者(做的那个push)线程在等待时获取锁:它只是在唤醒和调用lock.unlock()阻塞之间发生。

于 2013-03-10T05:57:21.933 回答