0

C++でのスレッドの使用に関する情報をオンラインで見つけるのに苦労しました。プログラムで実行する必要があるのは、main()に2つのスレッドを作成することです。これらの2つのスレッドは、テキストファイルで指定された文から単語を取得し、各単語の開始文字に応じて単語を出力します。一方のスレッドは母音で始まる単語を印刷し、もう一方のスレッドは子音で始まる単語を印刷する必要があります。main()自体は何も出力してはならず、単語の順序は文と同じままである必要があります。これを実現するには、2つのスレッドが互いに譲歩する必要があります。同期技術は使用できません。

テキストファイルをベクターに読み込んでいますが、現在は正常に機能しています。私のコードは正しい出力を取得できますが、指定された方法では実行できません。あなたが私を助けることができれば私はそれを大いに感謝します。ありがとうございました。

#include <iostream>
#include <thread>
#include <fstream>
#include <string>
#include <iterator>
#include <vector>
#include <sstream>

using namespace std;

void cons(string temp){
    if (temp[0] != 'A' && temp[0] != 'a' && temp[0] != 'E'&& temp[0] != 'e'&& temp[0] != 'I'&& temp[0] != 'i'&& temp[0] != 'O'&& temp[0] != 'o'&& temp[0] != 'U'&& temp[0] != 'u') {
        cout << "cons:  " << temp << endl;
    }
    this_thread::yield();
}

void vow(string temp){
    if (temp[0] == 'A'|| temp[0] == 'a'|| temp[0] == 'E'|| temp[0] == 'e'|| temp[0] == 'I'|| temp[0] == 'i'|| temp[0] == 'O'|| temp[0] == 'o'|| temp[0] == 'U'|| temp[0] == 'u') { 
        cout << "vow:   " << temp << endl;
    }
    this_thread::yield();
}


int main(){
    string sentence, temp;
    ifstream ifs;
    ofstream ofs;
    vector <thread> wordThreads;

    ifs.open("phrase.txt");
    getline(ifs, sentence);
    istringstream s(sentence);
    istream_iterator<string> begin(s), end;
    vector<string> words(begin, end); 

    ifs.close();

    for (int i=0; i < 5; i++) {
        wordThreads.push_back(thread(cons, words[i]));
        wordThreads.push_back(thread(vow, words[i]));
    }

    for (thread& t: wordThreads) // loop with a range variable
    t.join(); 
}
4

1 に答える 1

1

これは古いトピックであることは知っていますが、ここでの答えはPetersons、次の関数でアルゴリズムを使用することです。

loop
 flag[i] := true;   
 turn := j;    
 while flag[j] and turn = j do nothing;
 (critical section of code)  
 flag[i] := false;  
 (remainder section of code)   
end loop

これは、フラグの Bool 配列とターン変数に基づいて切り替えが発生するタイミングを制御します。どちらもグローバル共有メモリ空間にあります。ミューテックスは使用されません。

于 2015-10-10T16:49:13.743 に答える