私は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
私は数字が毎回ランダムであることを理解していますが、数字が表示されないことがあり、なぜだろうか?
それらはすべてあります。コンソール出力が漠然とランダムな順序で発生するため、それらは単に壊れています。
特に、出力の最初の行の終わりを見てください。
必要なことは、ミューテックスを追加して適切な位置にロックすることだけです。
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();
の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;
}