0

うわー、私のC++ヒーローによって書かれたこのページhttps://github.com/zaphoyd/websocketpp/blob/experimental/examples/broadcast_server/broadcast_server.cppについて知っていたらよかったのに/zaphoydは、C++ Websocket の冒険を始める前に作成されました。そこにはたくさんのレッスンがあります。

私がそれを正しく読んでいれば(それはストレッチです笑)、接続とメッセージの送信と受信はすべて単一のスレッドで処理されるように見えます(彼が「マルチスレッド」またはそれが呼ばれるまで待ちきれませんこの基本的な例では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.、別のスレッド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()

m_action_cond.wait(lock)質問に貼り付けたコードでは、条件を待っている間にロックのロックを解除し、(別のスレッドからのシグナルによるか、おそらく誤って)起動された後にロックを再度取得することに注意してください。待機中にプロデューサー (を実行するpushスレッド) スレッドがロックを取得するのlock.unlock()を妨げないでください。

于 2013-03-10T05:57:21.933 に答える