私はマルチスレッドでC++でのPetersonのアルゴリズムの簡単な実装を書いています。このプログラムは、2つのスレッドを通して文字列を変更します。しかし、私は最終結果を得ていません。どこが間違っていますか?以前C++ 11 C++にはスレッドモデルがなかったに C++マルチスレッドでのPetersonのアルゴリズム
using namespace std;
int flag[2]={0,1};
int turn;
void* first(void* data){
flag[0]=1;
turn=1;
while(flag[1] && turn==1){}
string &str=*(static_cast<string*>(data));
if(str!=""){
if(str=="abcd"){
str="Hello";
}
}
flag[0]=0;
pthread_exit(NULL);
}
void* second(void* data){
flag[1]=1;
turn=0;
while(flag[0] && turn==0){}
string &str=*(static_cast<string*>(data));
if(str!=""){
if(str=="wxyz"){
str="abcd";
}
}
flag[1]=0;
pthread_exit(NULL);
}
int main(){
int rc=0;
string s = "wxyz";
pthread_t t;
rc=pthread_create(&t,NULL,first,static_cast<void*>(&s));
if(rc!=0){
cout<<"error!";
exit(rc);
}
rc=pthread_create(&t,NULL,second,static_cast<void*>(&s));
if(rc!=0){
cout<<"error!";
exit(rc);
}
while(flag[0] && flag[1]!=0){}
cout<<s;
pthread_exit(NULL);
return 0;
}
これで 'std :: thread()'コードがこれより優れているでしょうか? – Adnan
@Adnanはい、また、 'flag'と' turn'std :: atomic型を作成する必要があります。また、文字列へのアクセスをmutexと同期させる必要があります。これをしないと、一方のスレッドは他方のスレッドが正しい順序で(またはまったく)変更を「参照」しません。 –
私は既に、文字列アクセスを相互に排除するPetersonのアルゴリズムを含んでいましたが、 'flag'と' turn'をアトミックにしませんでした。また、文字列の代入をアトミックに変換して(可能な場合)、結果を投稿します。 – Adnan