2016-09-23 15 views
3

これは、ユーザーが何かを入力するのを(無限ループを使用して)待ち、キューに格納するstart()関数を持つシンプルなプログラムです。 start()は別のスレッドで実行されます。ユーザーがある値を入力すると、キューのサイズはメインのままです。キューはどのように同期できますか?
コード:source.cpp
2つのスレッド間のキューの同期

#include <iostream> 
#include "kl.h" 

using namespace std; 

int main() 
{ 
    std::thread t1(start); 
    while (1) 
    { 
     if (q.size() > 0) 
     { 
      std::cout << "never gets inside this if\n"; 
      std::string first = q.front(); 
      q.pop(); 
     }   
    } 
    t1.join(); 
} 

コード:kl.h

#include <queue> 
#include <iostream> 
#include <string> 

void start(); 
static std::queue<std::string> q; 

コード:kl.cpp

#include "kl.h" 
using namespace std; 

void start() 
{ 
    char i; 
    string str; 
    while (1) 
    { 
     for (i = 0; i <= 1000; i++) 
     { 
      //other stuff and str input 
      q.push(str); 
     } 

    } 
} 
+0

を使用すると、ヘッダファイルでキューの「静的」を使用するので、あなたは実際に2つの異なるキュー、各CPPの1を持っている完全なコード – user6275035

+0

を追加しましたファイル。それで、メインのものは常に空です。 – tony

+0

@tony静的な削除時のリンカエラーを示します。 – user6275035

答えて

2

あなたのコードはraceが含まれています - 私がそれ墜落した。両方のスレッドが共有キューを変更する可能性があります。 (また、char iで1000までの値をループしています - おそらく良い考えではありません)

共有キューをstd::mutexで保護し、std::condition_variableを使用してチェックする必要があることを通知する必要があります待ち行列。

  1. アクセスミューテックスを保持している唯一のキュー:

    具体的には、(a producer consumerのあなたのケースのための非常に一般的である)以下のことを考慮すべきです。

  2. 条件変数を使用して、何かをプッシュしたことを通知します。

  3. 条件変数を使用して、処理を続行するポイントがあるときの条件を指定します。ここで

はあなたのコードの書き直したものです:

#include <iostream> 
#include <queue> 
#include <thread> 
#include <condition_variable> 
#include <mutex> 

using namespace std; 

std::queue<std::string> q; 
std::mutex m; 
std::condition_variable cv; 

void start() 
{ 
    string str; 
    for (std::size_t i = 0; i <= 1000; i++) { 
     //other stuff and str input 
     std::cout << "here" << std::endl; 
     std::unique_lock<std::mutex> lk(m); 
     q.push(str); 
     lk.unlock(); 
     cv.notify_one(); 
    } 
} 

int main() 
{ 
    std::thread t1(start); 
    for (std::size_t i = 0; i <= 1000; i++) 
    { 
     std::unique_lock<std::mutex> lk(m); 
     cv.wait(lk, []{return !q.empty();}); 
     std::string first = q.front(); 
     q.pop();  
    } 
    t1.join(); 
} 
関連する問題