2016-05-27 3 views
-1

大きなプログラムの基本コードを記述しようとしています。 元のコードは、私の計算のいくつかの結果をtxtファイルに書き込むと仮定しますが、ここでは、数値1を書くように変更しました(コードを単純化するため)。 問題は、私が得ると思うものの数を得ることができないということです.1000枚の印刷物1000枚を印刷します。それぞれの印刷枚数は1枚ずつ大きくなります。スレッドを使用すると重複が印刷されるC++

私のコードに問題があります?

(私は窓10、コードブロックのワークスペースを使用しています、私はC++のコードを書いている)

コード:

#include <iostream> 
    #include <thread> 
    #include <vector> 
    #include <fstream> 
    using namespace std; 
    ofstream myfile; 
    void doTask() 
    { 

     myfile << "1\n"; 
    } 

    void f() 
    { 
     vector<thread> threads; 
     for(int i = 0; i < 10; ++i) 
     { 
      threads.push_back(thread(doTask)); 
     } 

     for(int j=0; j<10; j++) threads[j].join(); 
     threads.erase(threads.begin(), threads.end()); 
    } 




    int main() 
    { 
     myfile.open("a.txt"); 
     for(int i=0; i<100; i++) f(); 
     myfile.close(); 
     return 0; 
    } 

はあなたのすべてをありがとう!

+0

正常です。どうしたの? 1つの値を1000回pritingします。 – Sumeet

+1

'ofstream'はスレッドセーフではありませんので、mutexを追加して一度に1つのスレッドしか書き込まないようにする必要があります。 – user657267

+0

'threads'を消去する必要はありません。デストラクタがそれを処理します。また、明示的に 'myfile'を閉じる必要もありません(デストラクタがそれを処理します)。 – molbdnilo

答えて

0

ストリームスレッドを安全にします。次はやります。

#include <iostream> 
#include <thread> 
#include <vector> 
#include <fstream> 
#include <mutex> 
using namespace std; 
ofstream myfile; 
std::mutex myMutex; 

void doTask() 
{ 
    myMutex.lock(); 
    myfile << "1\n"; 
    myMutex.unlock(); 
} 

void f() 
{ 
    vector<thread> threads; 
    for(int i = 0; i < 10; ++i) 
    { 
     threads.push_back(thread(doTask)); 
    } 

    for(int j=0; j<10; j++) threads[j].join(); 
    threads.erase(threads.begin(), threads.end()); 
} 




int main() 
{ 
    myfile.open("a.txt"); 
    for(int i=0; i<100; i++) f(); 
    myfile.close(); 
    return 0; 
} 
+0

あなたを奪う!できます :) –

関連する問題