を使用してマルチスレッドがどのように機能するかを理解するために、小さな C++ プログラムをコーディングしましたstd::thread
。これが私のプログラム実行のステップです:
- クラス 'Toto' に含まれる一意の値 '42' を持つ整数の 5x5 マトリックスの初期化 (メインで初期化)。
- 初期化された 5x5 マトリックスを出力します。
std::vector
5 スレッドの宣言。- すべてのスレッドをそれぞれのタスク (
threadTask
メソッド) にアタッチします。各スレッドはstd::vector<int>
インスタンスを操作します。 - 私はすべてのスレッドに参加します。
- 5x5 行列の新しい状態を出力します。
出力は次のとおりです。
42 42 42 42 42
42 42 42 42 42
42 42 42 42 42
42 42 42 42 42
42 42 42 42 42
42 42 42 42 42
42 42 42 42 42
42 42 42 42 42
42 42 42 42 42
42 42 42 42 42
そのはず :
42 42 42 42 42
42 42 42 42 42
42 42 42 42 42
42 42 42 42 42
42 42 42 42 42
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
コードサンプルは次のとおりです。
#include <iostream>
#include <vector>
#include <thread>
class Toto
{
public:
/*
** Initialize a 5x5 matrix with the 42 value.
*/
void initData(void)
{
for (int y = 0; y < 5; y++) {
std::vector<int> vec;
for (int x = 0; x < 5; x++) {
vec.push_back(42);
}
this->m_data.push_back(vec);
}
}
/*
** Display the whole matrix.
*/
void printData(void) const
{
for (int y = 0; y < 5; y++) {
for (int x = 0; x < 5; x++) {
printf("%d ", this->m_data[y][x]);
}
printf("\n");
}
printf("\n");
}
/*
** Function attached to the thread (thread task).
** Replace the original '42' value by the another one.
*/
void threadTask(std::vector<int> &list, int value)
{
for (int x = 0; x < 5; x++) {
list[x] = value;
}
}
/*
** Return a sub vector reference according to the range.
*/
std::vector<int> &getDataByRange(int range)
{
return (this->m_data[range]);
}
private:
std::vector<std::vector<int> > m_data;
};
int main(void)
{
Toto toto;
toto.initData();
toto.printData(); //Display the original 5x5 matrix (first display).
std::vector<std::thread> threadList(5); //Initialization of vector of 5 threads.
for (int i = 0; i < 5; i++) { //Threads initializationss
std::vector<int> &vec = toto.getDataByRange(i); //Get each sub-vectors reference.
threadList.at(i) = std::thread(&Toto::threadTask, toto, vec, i); //Each thread will be attached to a specific vector.
}
for (int j = 0; j < 5; j++) {
threadList.at(j).join();
}
toto.printData(); //Second display.
getchar();
return (0);
}
ただし、メソッドthreadTask
で変数を出力するlist[x]
と、出力は正しくなります。threadTask
printData() 呼び出しがメインスレッドにあり、メソッドが独自のスレッド(メインスレッドではない)で実行されるため、関数の表示が正しいため、メインで正しいデータを印刷できないと思います。奇妙なことに、親プロセスで作成されたすべてのスレッドが、この親プロセスのデータを変更できないということですか? コードで何かを忘れていると思います。私は本当に迷っています。誰でも私を助けることができますか?よろしくお願いいたします。