0

一連のローカル変数を作成し、それらのアドレスを別のスレッドで実行される関数に渡す関数があります-次のようなものです:

void MyFunction()
{
    MyClass a;
    AnotherClass b;
    ...
    FinalClass z;

    CallFunctionInNewThread(&a,&b,&c,...,&z);
}

もちろん、これらの変数はMyFunctionがスコープ外になると破棄されるため(スレッド内の関数がガベージを指しているようになります)、このセットアップは機能しません。ここでの私のオプションは何ですか?'new'を使用してヒープに変数を割り当てた場合、それらを削除する機会はありません。それらをスマートポインターなどにすると、スレッド関数にスマートポインターとして受け入れさせる必要があります。そうしないと、参照カウントが増加しないため、すぐに破棄されます。MyFunctionのラッパークラスのメンバー変数になりたいようですが、数百行と数十行あり、それは非常に厄介です。他に選択肢はありますか?

4

2 に答える 2

0

実行できる小さなトリックの1つは、セマフォオブジェクトをスレッド関数に渡し、そのセマフォが通知されるのを待つことです。スレッドが正常に作成されたことを確認する必要があります。

新しいスレッドは、最初に値(またはスマートポインターの場合は参照)のローカルコピーを作成し、次にセマフォに信号を送って続行します。

呼び出し元のスレッドは、新しいスレッドに干渉することなく、これらのオブジェクトを続行してスタックから削除できます。どちらのスレッドでも不要になったため、セマフォオブジェクトを削除することもできます。

これは、呼び出し元のスレッドがスレッドが開始されてデータがコピーされるまで待機する必要があることを意味しますが、それはおそらく短時間です。スレッドを生成して作業を行う場合は、親スレッドでのこのわずかな遅延は許容できるはずです。

于 2012-11-02T01:32:47.223 に答える
0

他に選択肢はありますか?

単純に(些細な場合は)データをコピーするか、(作成するのが重い場合は)データを移動/交換します。これは、あるスレッドから別のスレッドに所有権を譲渡するのと同じです。スレッドAは実際には説明からの参照を必要としないようです。ボーナス:これにより、プログラムから同時アクセスの複雑さが解消されます。

于 2012-11-02T01:52:16.997 に答える