6

Visual Studio 2012 と C++11 を使用しています。これが機能しない理由がわかりません:

void client_loop(bool &run)
{
    while ( run );
}

int main()
{
    bool running = true;
    std::thread t(&client_loop,std::ref(running));

    running = false ;
    t.join();
}

この場合、スレッドのループはt決して終了しませんが、明示的に に設定runningfalseます。runそしてrunning同じ場所にあります。running単一のグローバル変数として設定しようとしましたが、何も起こりません。私もポインター値を渡そうとしましたが、何もしませんでした。

スレッドは同じヒープを使用します。本当にわかりません。誰でも私を助けることができますか?

4

2 に答える 2

11

プログラムにはUndefined Behaviorがあります。これは、変数にデータ競合が発生するためrunningです (1 つのスレッドが書き込み、別のスレッドが読み取ります)。

ミューテックスを使用してアクセスを同期するか、次のようにする必要がrunningありatomic<bool>ます。

#include <iostream>
#include <thread>
#include <atomic>

void client_loop(std::atomic<bool> const& run)
{
    while (run.load());
}

int main()
{
    std::atomic<bool> running(true);
    std::thread t(&client_loop,std::ref(running));

    running = false ;
    t.join();

    std::cout << "Arrived";
}

実際の動作例を参照してください。

于 2013-03-11T00:11:35.150 に答える
0

おそらく、コンパイラのconstコードの見方には影響しません。シングルスレッド アプリケーションでは、値は変更されません (この特定のプログラムは無意味です)。マルチスレッド アプリケーションでは、これはアトミック型であるため、コンパイラは負荷を最適化できません。実際、ここには実際の問題はありません。それは実際にはスタイルの問題です。mainは値を変更し、その変更を探すのでclient_loop、値が であると言うのは正しくないように思えますconst

于 2013-03-11T14:47:11.040 に答える