13

std::threadとメインスレッド(またはその他のスレッド)の間で変数を共有している場合thread::detach()、スレッドの作成直後にメソッドを実行しても、それらの共有変数にアクセスできますか?

4

2 に答える 2

19

はい!グローバル、キャプチャ、および渡された変数は、を呼び出した後も引き続きアクセスできますdetach()

ただし、detachを呼び出している場合は、スレッドを作成した関数から戻り、スレッドオブジェクトがスコープ外になる可能性があります。その場合は、その関数のローカルが参照またはポインターを介してスレッドに渡されないように注意する必要があります。

detach()スレッドは作成中のスレッドに対してローカルなものを必要としないという宣言と考えることができます。

int次の例では、スレッドは、スコープ外になった後も、開始スレッドのスタック上のにアクセスし続けます。これは未定義の動作です!

void start_thread()
{
    int someInt = 5;
    std::thread t([&]() {
        while (true)
        {
            // Will print someInt (5) repeatedly until we return. Then,
            // undefined behavior!
            std::cout << someInt << std::endl;
        }
    });

    t.detach();
}

敷物が糸の下から一掃されないようにするためのいくつかの可能な方法は次のとおりです。

  • intそれを必要とするスレッド(おそらくグローバル)の存続期間中にスコープから外れない場所を宣言します。
  • 共有データをとして宣言し、std::shared_ptrそれを値でスレッドに渡します。
  • 値を渡す(コピーを実行する)スレッドに渡します。
  • 右辺値参照(移動を実行)をスレッドに渡します。
于 2013-01-03T23:00:21.453 に答える
6

はい。スレッドを切り離すということは、スレッドが終了したときにスレッドがクリーンアップされ、スレッドを削除する必要がなくなったことを意味しますjoin

于 2013-01-03T22:44:15.900 に答える