imはいくつかの宿題を解決するためにpthreads cppライブラリを使い始めました。Whileループ内でPthreadを初期化する
1からTまでの名前のファイルごとにスレッドを作成する必要があります(Tは正の整数として定義されています)。このスレッドはこのファイルの情報を処理する必要があります。
実は、私の考えは、このように、主にwhileループを置くことです:まず
pthread_t threads[T];
void *imprime(void *arg) {
int a=-1, b=-1;
string* t = reinterpret_cast<std::string*>(arg); //Recovering str
string name = *t;
cout<<"\nName: "<<name<<endl;
ifstream inFile(nome.c_str());
while(inFile>>a) {
inFile>>b;
cout<<"a: "<<a<<"\nb: "<<b<<endl;
}
}
int main() {
int lim = 1;
string nome;
int a = 0, b = 0;
while(lim <= T) {
nome = to_string(lim);
cout<<"Opening: "<<lim<<endl;
pthread_create(&threads[lim], NULL, &imprime, (void *)&nome);
lim++;
}
cin.get();
return 0;
}
、スレッドのdidntの実行は、何も起こりませんでした。だから、私は "cin.get()"をしばらく置いていて、それはうまくいっている(私がまだ理解していなかったもの)。
しかし、Tが1の場合は正しく動作しますが、T> 1の場合は正常に動作します。
私は2つのファイル(名前1、2、3; int型 'a' と 'b' とスペースで区切って)入れ:
/*
File '1' = "1 2"
File '2' = "3 4"
File '3' = "5 6"
*/
をし、出力のthats:
Opening: 1
Opening: 2
Opening: 3
Nome: 3
a: 5
b: 6
Nome: 3
a: 5
b: 6
Nome: 3
a: 5
b: 6
なんらかの理由で、プログラムはスレッドを開始する前にT回中全体を実行し、最後のスレッドですべてのスレッドを上書きします。
私は何ができますか?
よりも良い選択肢だのstd ::スレッドを持っていますmain() 'が終了します。 –
これは、 'main'でリサイクルされる変数を使ってデータを共有する非常に危険な方法です。理想的には、所有権を引き継いだスレッドデータを与え、 'main'は決してそれに再び触れることはありません。スレッドが次のループ反復の前にその文字列を回転させてコピーするという保証はありません。 – tadman
代わりに 'std :: thread'を使わないのはなぜですか? – 4386427