<目次>
(1) C++のマルチスレッド処理のサンプルや概要について
(1-1) C++のマルチスレッドの概要
(1-2) 構文1:関数ポインタ式
(1-3) 構文1(例):関数ポインタ式(シングル)
(1-4) 構文1(例):関数ポインタ式(マルチ)
(1-5) 構文2:関数オブジェクト式
(1-6) 構文2(例):関数オブジェクト式(シングル)
(1-7) エラー対処
(1) C++のマルチスレッド処理のサンプルや概要について
(1-1) C++のマルチスレッドの概要
(1-2) 構文1:関数ポインタ式
std::thread スレッド名(関数名, 引数1, 引数2, ・・・);
スレッド名.join();
(1-3) 構文1(例):関数ポインタ式(シングル)
#include <iostream> #include <thread> using namespace std; //# スレッドの中で呼び出す関数 void hoge(int Z) { cout << Z << endl; } int main() { //# スレッド起動(関数ポインタをCallableとして起動) thread thr1(hoge, 999); //# th1の完了を待つ thr1.join(); return 0; }
●コンパイル&実行
# コンパイル $ g++ -g -o ./[ご自身のプログラム名] ./[ご自身のプログラム名].cpp -pthread -std=c++11 # 実行 $ ./[ご自身のプログラム名]
(図122)
(1-4) 構文1(例):関数ポインタ式(マルチ)
#include <iostream> #include <thread> using namespace std; //# スレッドの中で呼び出す関数 void hoge(int Z, int thrNo) { cout<<"### THREAD#"<<thrNo<<" START : "; for(int i=0; i<Z; i++){ cout << i << " "; } cout<<endl; } int main() { //# スレッド起動(関数ポインタをCallableとして起動) thread thr1(hoge, 10, 1); thread thr2(hoge, 20, 2); thread thr3(hoge, 30, 3); //# thNの完了を待つ thr1.join(); thr2.join(); thr3.join(); return 0; }
●コンパイル&実行
# コンパイル $ g++ -g -o ./[ご自身のプログラム名] ./[ご自身のプログラム名].cpp -pthread -std=c++11 # 実行 $ ./[ご自身のプログラム名]
(1-5) 構文2:関数オブジェクト式
std::thread スレッド名(関数オブジェクト名, 引数1, 引数2, ・・・);
(1-6) 構文2(例):関数オブジェクト式(シングル)
#include <iostream> #include <thread> using namespace std; //# スレッドの中で呼び出す関数 // A callable object class thr_obj { public: void operator()(int Z,int thrNo) { cout<<"### THREAD#"<<thrNo<<" START : "; for (int i = 0; i < Z; i++){ cout << i << " "; } cout<<endl; } }; int main() { //# スレッド起動(関数ポインタをCallableとして起動) thread thr2(thr_obj(), 20, 2); //# thNの完了を待つ thr2.join(); return 0; }
●コンパイル&実行
# コンパイル $ g++ -g -o ./[ご自身のプログラム名] ./[ご自身のプログラム名].cpp -pthread -std=c++11 # 実行 $ ./[ご自身のプログラム名]
(図142)
(1-7) エラー処理
●エラー(実行時)
terminate called after throwing an instance of 'std::system_error' what(): Enable multithreading to use std::thread: Operation not permitted Aborted (core dumped)
(図151)
●対処
コンパイル時のコマンドに「-pthread」を追記して、pthreadをリンクさせます。
# Before g++ -g -o ./thread_single1 ./thread_single1.cpp -std=c++11 # After g++ -g -o ./thread_single1 ./thread_single1.cpp -pthread -std=c++11
(図152)