1

F のようなファンクタがあるとします。

struct F
{
    // <some member variables go here>
    void operator()() { while(true) /*do stuff affecting the state*/; }
};

Fs のベクトルを作成すると

std::vector<F> functorVec(10);

そして、これらのファンクターで一連のスレッドを開始します

for (int i = 0; i < functorVec.size(); ++i)
{
    boost::thread(functorVec[i]); 
}

そして今、私は自分のベクトルに次のようなことをします

functorVec.push_back(F());

ベクトルが展開され、その内容が新しい場所にコピーされた場合、スレッドで未定義の動作が発生しますか? それとも単にクラッシュするのでしょうか?

何らかの操作を行っている途中で、状態が移動したようです。実際には、作業を行っているオブジェクトはコピーされてから削除されますよね? 移動はスレッドの実行とは非同期であるため、悪いニュースのように思えます。

それぞれが独自のスレッドを実行しているオブジェクトのコレクションを保持できるようにしたいので、お願いします。これらのオブジェクトは、システムに接続されたモジュールを表します。オンザフライでモジュールを追加および取り外しできるようにしたいと考えています。オブジェクトをコレクションに格納することが適切でない場合、代替手段は何ですか? それらをヒープに割り当て、ポインターをコレクションに格納する必要がありますか?

これがまったく問題ではない場合、その理由を説明していただけますか?

4

3 に答える 3

3

boost::thread documentationによると、ファンクタを保存する必要はまったくありません。呼び出し可能なオブジェクトは構築時にコピーされ、提供したオリジナルは二度と参照されません。

于 2013-08-02T07:06:18.720 に答える