0
#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。变量通过使用相同的结构对象来共享。最后,我从 struct 对象打印 x 和 y 的值。

我看到在函数中的一小段 while 循环中process,无论线程数 n 多少,我都能得到正确的结果。但是,对于较大的值,大约 5000,我有时会得到错误的结果。

此外,执行时间随着线程数的增加而增加,我不明白这是因为不正确的多线程还是因为创建更多线程的开销。

感谢您提前提供任何帮助。

4

1 回答 1

0

除非我们使用互斥锁或某种方法来确保写入的原子性,否则我们不能保证我们会在 pthread 应用程序中获得正确的值。这是因为,同时写入会导致竞争条件,只有一个写入会影响共享变量。

于 2021-04-12T17:45:58.800 回答