2

ブースト Web サイトの例に基づいてアプリケーションを構築しています。これらは、知っておくべき関連する定義です。

typedef boost::shared_ptr< 接続 > connection_ptr;
std::set< connection_ptr> connections_;
std::vector< boost::shared_ptr< boost::thread> > スレッド。

connection はクラスです。

ファイルの 1 つであるconnection_manager.cppでは、次のようにしています。

void connection_manager::start(connection_ptr c)
{
  connections_.insert(c);
  c->start();
}

ここで、プログラム構造のために、すべての新しい接続を別のスレッドで開始したいと考えています。したがって、次のように上記を変更しました。

void connection_manager::start(connection_ptr c)
{
    boost::shared_ptr<boost::thread>thread(新しいboost::thread(
                        boost::bind(&connection::start, c)));

    // 新しく作成されたスレッドをベクターにプッシュします
    スレッド.push_back(スレッド);

    // 接続をセットに保存します
    connections_.insert(c);
}

私の問題、つまりこの質問は、これらの connection_ オブジェクトを 1 つだけにしたい場合です。以前に提供されたリンクでは、彼らは次のようにしています:

void connection_manager::stop(connection_ptr c)
{
    connections_.erase(c);
    c->stop();

    // スレッド間の接続を見つけて、そのスレッドに参加します
}

しかし、上記のコメントが示唆するように、すべてのスレッドの中から c を見つけて、そのスレッドだけを停止するにはどうすればよいでしょうか。そのスレッドの join() 関数を呼び出したい。


アップデート:

これこそが、私が本当に手に入れたいものだと思います!だから私は自分の変数を次のように宣言します

std::map < connection_ptr, boost::shared_ptr < boost::thread > > スレッド;

では、以前と同じ方法で新しいトレッドを作成するにはどうすればよいでしょうか。お気に入り:

boost::shared_ptr < boost::thread > thread(new boost::thread(
                        boost::bind(&connection::start, c)));

しかし、次のステップは何ですか?混乱させてすみません... :-)

4

2 に答える 2

2

ベクトルの代わりにマップ (または他の連想コンテナー) を使用すると、接続とスレッド間の関連付けを維持できます。

std::map<connection_ptr, boost::shared_ptr<boost::thread> > threads;

次のように記述できます。

threads[connection] = thread;

スレッドを作成した後の push_back 呼び出しの代わりに、次のようにします。

threads[connection]->stop();

後で調べたいときに。

注意: 一般的なコメントとして、スレッドとネットワーク接続の間で 1:1 のマッピングを維持するアプリケーションは、サービス拒否 (DoS) 攻撃に対して非常に脆弱です。

于 2011-05-13T11:10:43.533 に答える
1

接続が常にスレッドにバインドされている場合は、接続オブジェクトが実行中のスレッドを指すようにし、スレッドで開始するロジックを接続クラス自体に移動するだけで十分です。

于 2011-05-13T11:28:03.923 に答える