2016-08-03 4 views
0

こんにちは、私はC++でマルチスレッド化するのが初めてです。私は別のスレッドで関数を実行するためにC++ 11で利用可能なスレッドクラスを使用していますが、何とか関数から取得している出力は非常に扱いにくいです。これは、異なるスレッドが同じ変数を同時に実行しようとしている可能性があり、競合を引き起こす可能性があるからです。正しい出力が得られるようにコードを修正する方法を提案してください。私は何をしようとしているのかのサンプルコードを投稿しています。これは元のコードではありませんが、元のコードが長すぎて投稿できないため、元のコードの流れが表示されますが、問題は同じです。別のスレッドで実行されている関数が奇妙な出力を生成する

#include<iostream> 
    #include<thread>  

    using namespace std; 

    typedef struct { 
     int thread_id; 
     char *message; 
    }threadData; 

    int display(threadData *tData){ 
     threadData *my_data; 
     my_data = (threadData *) tData; 

     cout << "Thread ID: " << my_data -> thread_id << endl; 
     cout << "Message: " << my_data -> message << endl; 

     return 0; 
    } 

    int main(){ 

     threadData *data; 

     data = (threadData *)malloc(sizeof(threadData)); 
     data->thread_id = 12; 
     data->message = "This is the message"; 
     for (int i = 0; i<10; i++) 
     { 
      std::thread t1(display, data);  
      t1.detach(); 
     } 
     return 0; 
    } 

出力:スレッドとして

Thread ID: 12 
    Message: This is the messageThread ID: 
    12 
    Message: This is the message 
    Thread ID: 12 
    Message: This is the message 
    Thread ID: 12 
    Message: This is the message 
    Thread ID: 12 
    Message: This is the message 
+1

ロックとメモリモデルについて読んでみたいです。真剣に:これは非常に広いトピックです。あなたは "例で"行くべきではありません。しかし、 "概念によって"。意味:その話題に関する研究をする。たとえば、ネットで "C++スレッドロックの例"を検索することによって実行できます。私が意味することは:はい、人々があなたにものを説明するときはうれしいです。しかし、このようなものは何百倍も記録されています。この質問を書くよりも、あなた自身がネットを検索する時間が少なくて済みます**。注意してください:これはまだ有効な質問ですので、downvoteまたはクローズ投票はありませんが、まだ... – GhostCat

+1

実際に、ロックと一般的なスレッドの概念について読むことができます。また、 'malloc'と' C++ '? 'typedef struct'?あなたはC++を少しでも元気にしたいかもしれません。 –

答えて

0

は、共有リソースへのアクセスを保護する必要が 、最初に実行されるguarunteeしません。 これを行う最も簡単な方法は、ミューテックスを使用する方法です。

std::mutex g_i_mutex; // protects g_i 

typedef struct { 
    int thread_id; 
    string message; 
}threadData; 

int display(threadData *tData) 
{ 
std::lock_guard<std::mutex> lock(g_i_mutex); 
threadData *my_data; 
my_data = (threadData *) tData; 

cout << "Thread ID: " << my_data -> thread_id << endl; 
cout << "Message: " << my_data -> message << endl; 

return 0; 

}

出力:

スレッドID:12 メッセージ:このメッセージ スレッドIDである:12 メッセージ:これは、メッセージ スレッドIDである:12 メッセージ:これはメッセージです スレッドID:12 メッセージ:これはメッセージです

スレッディングの概念について少しお読みになることをお勧めします。その背後にある概念は単純ではなく、単に準備が整ったソリューションを手に入れても長期的にはあなたを助けません。

2

私が読んだのは、ループが10回実行されると予想されますが、主な機能ではすべてのスレッドが完了するのを待っていなかったためです実行するチャンスを持つスレッド。 'main'は、すべてのスレッドが作業を完了するのを待つためにしばらくスリープ状態にする必要があります。

ここで競合状態は見られませんでした。なぜなら、すべてのスレッドがただ読んでいて、誰もthreadDataに書き込んでいないからです。

関連する問題