Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 多线程降低了效率,可能是由于“错误共享”造成的`_C++_Multithreading_False Sharing - Fatal编程技术网

C++ 多线程降低了效率,可能是由于“错误共享”造成的`

C++ 多线程降低了效率,可能是由于“错误共享”造成的`,c++,multithreading,false-sharing,C++,Multithreading,False Sharing,我需要计算两个使用相同参数的不同函数(仅用于读取)。在我将程序多线程化之后,程序运行需要2倍的时间(而不是0.5倍)。我是多线程编程新手,但我怀疑错误共享 我的原始代码(剪切): #包括 双分形孪晶(双μ,双西格玛,p){ 返回1; } 双区孪生(双μ,双西格玛,p){ 返回2; } int main(){ int n_t=100; double*num_t=新的双精度[n_t]; double*dist_t=新的双精度[n_t]; 双μ=2;双西格玛=1; 双数字,距离; 对于(double

我需要计算两个使用相同参数的不同函数(仅用于读取)。在我将程序多线程化之后,程序运行需要2倍的时间(而不是0.5倍)。我是多线程编程新手,但我怀疑
错误共享

我的原始代码(剪切):

#包括
双分形孪晶(双μ,双西格玛,p){
返回1;
}
双区孪生(双μ,双西格玛,p){
返回2;
}
int main(){
int n_t=100;
double*num_t=新的双精度[n_t];
double*dist_t=新的双精度[n_t];
双μ=2;双西格玛=1;
双数字,距离;

对于(double p=0.001;p您在线程中调用的函数所做的工作非常少,启动这些线程的成本超过了使用多个线程所获得的收益。错误共享与此无关


由于
mu
sigma
p
是按值传递的,因此它们可以在两个线程之间共享(并且,在任何情况下,作为lambda函数开销的一部分进行复制)。

每次迭代都会启动一个新线程。然而,线程启动是一个代价高昂的过程。这可能会解释性能损失。
#include <iostream>

double frac_twins(double mu, double sigma,p){
    return 1;
}
double dist_twins(double mu, double sigma,p){
    return 2;
}

int main(){

int n_t=100;

double* num_t = new double[n_t];
double* dist_t = new double[n_t];

double mu=2; double sigma=1;
double num,dist;

for(double p=0.001; p<=0.101;p+=0.001){

    num=frac_twins(mu,sigma,p);
    dist=dist_twins(mu,sigma,p);

      num_t[i]=num;
      dist_t[i]=dist;
      i++;
}

return 0;
}
#include <iostream>
#include <thread>

double frac_twins(double mu, double sigma,p){
    return 1;
}
double dist_twins(double mu, double sigma,p){
    return 2;
}

int main(){

int n_t=100;

double* num_t = new double[n_t];
double* dist_t = new double[n_t];

double mu=2; double sigma=1;
double num,dist;

for(double p=0.001; p<=0.101;p+=0.001){

      std::thread t1([&num,mu,sigma,p](){
    num=frac_twins(mu,sigma,p);
      });
      std::thread t2([&dist,mu,sigma,p](){
    dist=dist_twins(mu,sigma,p);
      });

      t1.join();
      t2.join();

      num_t[i]=num;
      dist_t[i]=dist;
      i++;
}

return 0;
}
#include <iostream>
#include <thread>

double frac_twins(double mu, double sigma,p){
    return 1;
}
double dist_twins(double mu, double sigma,p){
    return 2;
}

int main(){

int n_t=100;

double* num_t = new double[n_t];
double* dist_t = new double[n_t];

double mu=2; double sigma=1;
double mu2=2; double sigma2=1; double p2;

double num,dist;

for(double p=0.001; p<=0.101;p+=0.001){

      std::thread t1([&num,mu,sigma,p](){
    num=frac_twins(mu,sigma,p);
      });
      mu2=mu; sigma2=sigma; p2=p;
      std::thread t2([&dist,mu2,sigma2,p2](){
    dist=dist_twins(mu,sigma,p);
      });

      t1.join();
      t2.join();

      num_t[i]=num;
      dist_t[i]=dist;
      i++;
}

return 0;
}