pthread 中的共享变量
Shared Variable in pthread
#include<iostream>
#include<pthread.h>
#include<chrono>
struct Arg1{
int x,y;
};
void * process(void * threadarg){
int x,y;
Arg1 * myArg1;
myArg1 = (Arg1 *) threadarg;
x = myArg1->x;
y=myArg1->y;
int i=0;
while(i<500){
x+=1;
y+=2;
i++;
}
myArg1->x=x;
myArg1->y=y;
pthread_exit(NULL);
}
using namespace std;
int main(){
int x = 0;
int y = 0;
int n;
cin>>n;
Arg1 sharedObj;
sharedObj.x=x;
sharedObj.y=y;
auto start = chrono::high_resolution_clock::now();
pthread_t *threads = new pthread_t[n];
for(int i=0;i<n;++i){
pthread_create(&threads[i],NULL,process,(void *)&sharedObj);
}
for(int i=0;i<n;++i){
pthread_join(threads[i],NULL);
}
cout<<sharedObj.x<<" "<<sharedObj.y<<"\n";
auto stop = chrono::high_resolution_clock::now();
auto duration = chrono::duration_cast<chrono::microseconds>(stop-start);
cout<<duration.count()<<"\n";
}
我写这段代码是为了看看使用共享变量是否会导致结果出现问题。
它的作用是这样的——它首先询问用户线程数 n
。每个线程将共享变量 x 和 y 分别递增 1 和 2。通过使用相同的结构对象共享变量。最后,我从结构对象中打印出 x 和 y 的值。
我看到函数 process
中的一个小 while 循环,我能够得到正确的结果,无论线程数 n。但是,对于大约 5000 的大值,我有时会得到错误的结果。
另外,执行的时间随着线程数的增加而增加,我不明白这是因为多线程不当还是因为创建更多线程的开销。
提前感谢您的帮助。
除非我们使用互斥锁或某种方法来确保写入的原子性,否则我们无法保证我们会在 pthreaded 应用程序中获得正确的值。这是因为,同时写入会导致竞争条件,只有一个写入会影响共享变量。
#include<iostream>
#include<pthread.h>
#include<chrono>
struct Arg1{
int x,y;
};
void * process(void * threadarg){
int x,y;
Arg1 * myArg1;
myArg1 = (Arg1 *) threadarg;
x = myArg1->x;
y=myArg1->y;
int i=0;
while(i<500){
x+=1;
y+=2;
i++;
}
myArg1->x=x;
myArg1->y=y;
pthread_exit(NULL);
}
using namespace std;
int main(){
int x = 0;
int y = 0;
int n;
cin>>n;
Arg1 sharedObj;
sharedObj.x=x;
sharedObj.y=y;
auto start = chrono::high_resolution_clock::now();
pthread_t *threads = new pthread_t[n];
for(int i=0;i<n;++i){
pthread_create(&threads[i],NULL,process,(void *)&sharedObj);
}
for(int i=0;i<n;++i){
pthread_join(threads[i],NULL);
}
cout<<sharedObj.x<<" "<<sharedObj.y<<"\n";
auto stop = chrono::high_resolution_clock::now();
auto duration = chrono::duration_cast<chrono::microseconds>(stop-start);
cout<<duration.count()<<"\n";
}
我写这段代码是为了看看使用共享变量是否会导致结果出现问题。
它的作用是这样的——它首先询问用户线程数 n
。每个线程将共享变量 x 和 y 分别递增 1 和 2。通过使用相同的结构对象共享变量。最后,我从结构对象中打印出 x 和 y 的值。
我看到函数 process
中的一个小 while 循环,我能够得到正确的结果,无论线程数 n。但是,对于大约 5000 的大值,我有时会得到错误的结果。
另外,执行的时间随着线程数的增加而增加,我不明白这是因为多线程不当还是因为创建更多线程的开销。
提前感谢您的帮助。
除非我们使用互斥锁或某种方法来确保写入的原子性,否则我们无法保证我们会在 pthreaded 应用程序中获得正确的值。这是因为,同时写入会导致竞争条件,只有一个写入会影响共享变量。