我写了一个简单的实现Peterson的C++多线程算法。该程序通过两个线程更改字符串。但我没有得到最终结果。我错在哪里? 彼得森的C++多线程算法
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类型 - 加上同步访问字符串与互斥体。如果你不这样做,一个线程将不会以正确的顺序(或根本)“看到”另一个线程所做的更改。 –
我已经包含了彼得森的算法来相互排除字符串访问,但没有使'flag'和'turn'原子。我也将字符串赋值转换为原子(如果可能的话),并发布结果 – Adnan