web-dev-qa-db-ja.com

C ++ 11スレッドの簡単な例

私はC++を初めて使用し、C++クロスプラットフォームスレッドチュートリアルを検討していました。私はこれを見ていた: http://solarianprogrammer.com/2011/12/16/cpp-11-thread-tutorial/

そして、次のコードを実行しようとしました:

#include <iostream>
#include <thread>

static const int num_threads = 10;

//This function will be called from a thread

void call_from_thread(int tid) {
    std::cout << "Launched by thread " << tid << std::endl;
}

int main() {
    std::thread t[num_threads];

    //Launch a group of threads
    for (int i = 0; i < num_threads; ++i) {
        t[i] = std::thread(call_from_thread, i);
    }

    std::cout << "Launched from the main\n";

    //Join the threads with the main thread
    for (int i = 0; i < num_threads; ++i) {
        t[i].join();
    }

    return 0;
}

私が得ている出力は次のとおりであり、理由を理解できません:

syd@syd-HP-Compaq-dx7500-Microtower:~/Desktop$ ./ref
Launched by thread Launched by thread Launched by thread Launched by thread Launched by thread 201
Launched by thread 5

Launched by thread 6
4
Launched by thread 7
3

Launched by thread 8
Launched from the main
Launched by thread 9

私は数字が毎回ランダムであることを理解していますが、数字が表示されないことがあり、なぜだろうか?

17
Sastidar

それらはすべてあります。コンソール出力が漠然とランダムな順序で発生するため、それらは単に壊れています。

特に、出力の最初の行の終わりを見てください。

必要なことは、ミューテックスを追加して適切な位置にロックすることだけです。

std::mutex mtx;

-

void call_from_thread(int tid) {
    mtx.lock();
-----------------------------------------------------------
    std::cout << "Launched by thread " << tid << std::endl;
-----------------------------------------------------------
    mtx.unlock();
}

-

mtx.lock();
-----------------------------------------------------------
std::cout << "Launched from the main\n";
-----------------------------------------------------------
mtx.unlock();

これを参照

12
Sway Jan

のIO(cout)に競合状態があります

std::cout << "Launched by thread " << tid << std::endl;

実際には、cout(「スレッドで起動」、tid、std :: endl)シーケンスの保証はありません。そして、それは次のように振る舞います:

std::cout << "Launched by thread " ;
cout<< tid ;
cout<< std::endl;

call_from_threadを次のように変更できます。

void call_from_thread(int tid) {
    std::cout << std::string("Launched by thread " + std::to_string(tid) + "\n");
}

次のポイントは

t[i] = std::thread(call_from_thread, i);

スレッドを作成すると、作成時に関数call_from_threadが呼び出されます。

だから、移動する方が良い

std::cout << "Launched from the main\n";

//Launch a group of threads
for (int i = 0; i < num_threads; ++i) {
    t[i] = std::thread(call_from_thread, i);
}

holders を使用することもできます:

mutex g_i_mutex;  // protects cout

void call_from_thread(int tid) {
    lock_guard<mutex> lock(g_i_mutex);
    cout << "Launched by thread " ;
    cout<< tid ;
    cout<< std::endl;
} 
3
Sam Mokari