2016-11-03 12 views
0

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回中全体を実行し、最後のスレッドですべてのスレッドを上書きします。

私は何ができますか?

+1

よりも良い選択肢だのstd ::スレッドを持っていますmain() 'が終了します。 –

+0

これは、 'main'でリサイクルされる変数を使ってデータを共有する非常に危険な方法です。理想的には、所有権を引き継いだスレッドデータを与え、 'main'は決してそれに再び触れることはありません。スレッドが次のループ反復の前にその文字列を回転させてコピーするという保証はありません。 – tadman

+0

代わりに 'std :: thread'を使わないのはなぜですか? – 4386427

答えて

1

nomeへのポインタを渡すことは、個々のスレッドが値を再度コピーする前に値をコピーしているかどうかを確かめることができないため、悪い考えです。main

スレッドへの引数の配列を作成します:あなたが代わりに使用するメインのスレッドをjoin必要があります)

1:

string threads_args[T]; 

、その後

threads_args[lim] = to_string(lim); 
    cout<<"Opening: "<<lim<<endl; 
    pthread_create(&threads[lim], NULL, &imprime, (void *)&threads_args[lim]); 

さらに通知を行いますcin.get

2)while(lim <= T)while(lim < T)とする。現在、配列の境界外にアクセスしています。また、あなたはおそらく0代わりの1から開始し、その後threads_args[lim] = to_string(lim+1);

3)C++ 11を持っているlimをしたいと、あなたは `前に、すべてのスレッドに参加することを欠場pthreadの

+0

ありがとう、私はそれをやった、今は動作するようです。 std :: threadsについて、私の先生は私たちにpthreads = /;を使用する許可を与えました。 – Lucas

+0

それは助けてよかった。あなたの先生について:少なくとも、std :: threadについてまだ学習していないのであれば、奇妙なことだと思います。C++に含まれているスレッドシステムが、IMOの出発点になるはずです。 – 4386427

関連する問題