2016-11-07 21 views
0

3スレッドを作成しています。 1を使用してユーザー1からの入力を読み取って文字列操作を行い、1を使用してコマンドプロンプトに書き込みます。3スレッド実行時のセグメンテーションフォルト

cout文を設定して、どこでエラーが発生しているかを確認しました。私はスレッドを作成した後にいつかエラーが発生しているのがわかります。

スレッドが最初に実行されるものでなければならないと思います。 readerThread関数を最初に実行し、次にconverterThreadを実行し、最後にwriterThreadを実行します。私はスレッドの実行順序を制限するためにこれらのロジックを実装する方法を探していました。データが到着する前に

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; 
int counter = 0; 
vector<string> readBuffer; 
vector<string> writeBuffer; 
int main(){ 
    int readerInt,writerInt,converterInt; 
    pthread_t reader,writer,converter; 
    cout << "BEFORE"<<endl; 
    readerInt = pthread_create(&reader, NULL,readerThread,NULL); 
    converterInt = pthread_create(&converter,NULL,converterThread,NULL); 
    writerInt = pthread_create(&writer,NULL,writerThread,NULL); 
    cout << "AFTER" << endl; 

    pthread_join(reader,NULL); 
    pthread_join(converter,NULL); 
    pthread_join(writer,NULL); 

    return 0; 
} 
void * readerThread(void *unused){ 
    while(1){ 
    pthread_mutex_lock(&lock); 
    string readLine; 
    getline(cin,readLine); 
    counter++; 
    readBuffer.push_back(readLine); 
    pthread_mutex_unlock(&lock); 
    } 
} 
void * converterThread(void *unused){ 
    while(1){ 
    pthread_mutex_lock(&lock); 
    if(readBuffer.size() > 0){ 
     replace(readBuffer[counter-1].begin(),readBuffer[counter-1].end(),' ','%'); 
     writeBuffer.push_back(readBuffer[counter-1]); 
    } 
    pthread_mutex_unlock(&lock); 
    } 
} 
void * writerThread(void *unused){ 
    while(1){ 
    pthread_mutex_lock(&lock); 
    cout << writeBuffer[counter-1] << endl; 
    pthread_mutex_unlock(&lock); 
    } 
} 
+0

[reader-writers](https://en.wikipedia.org/wiki/Readers-writers_problem)のような問題が発生します。あなたの最寄りのブラウザを参照してGoogleを起動すると、答えが待たれているはずです – smac89

答えて

1

あなたwriterThreadスレッドがジョブを開始し、あなたがアクセスします:

は、とにかくここに私のコードです

cout << writeBuffer[counter-1] << endl; 

counterはまだ0です。アクセスする前に、writeBufferのサイズを確認する必要があります。

counter変数は常にwriteBufferには有効ではありません。データがreadBufferにあるときに発生しますが、まだ処理されていないのはconverterThreadです。

可変利用を削除し、readBufferwriteBufferのデータ構造を改善することができます。データ変換用のキューを作成するには、std::queueを使用します。読み取りデータ用に1つのキューreadBufferと、処理結果に対して1つのキューwriteBufferがあります。プッシュ/ポップ方式を使用します。

+0

さて、私はそれが私の 'readerThread'機能をループし続けているようだというエラーを受けています。そのロック解除のように見えません。そうであれば、他の機能が実行される前に再ロックされます。 – droly96

+0

@ droly96セグメント化の不具合が修正された場合、mutexロックの前に 'sleep(1)'を実行し、スレッドをデバッグして何が間違っているかを確認することができます。 – Nikita

関連する問題