函数以std::async启动,经过多次迭代后崩溃 我试图在C++中开发一个简单的进化算法。为了加快计算速度,我决定使用异步函数一次运行多个计算: std::vector<std::future<int> > compute(8); unsigned nptr = 0; int syncp = 0; while(nptr != network::networks.size()){ compute.at(syncp) = std::async(&network::analyse, &network::networks.at(nptr), data, width, height, sw, dFnum.at(idx)); syncp++; if(syncp == 8){ syncp = 0; for(unsigned i = 0; i < 8; i++){ compute.at(i).get(); } } nptr++; }

函数以std::async启动,经过多次迭代后崩溃 我试图在C++中开发一个简单的进化算法。为了加快计算速度,我决定使用异步函数一次运行多个计算: std::vector<std::future<int> > compute(8); unsigned nptr = 0; int syncp = 0; while(nptr != network::networks.size()){ compute.at(syncp) = std::async(&network::analyse, &network::networks.at(nptr), data, width, height, sw, dFnum.at(idx)); syncp++; if(syncp == 8){ syncp = 0; for(unsigned i = 0; i < 8; i++){ compute.at(i).get(); } } nptr++; },c++,multithreading,pointers,asynchronous,C++,Multithreading,Pointers,Asynchronous,现在,不需要分析函数本身——我确信它可以工作,我已经在一个线程上测试了它,它运行得很好。唯一的问题是,在执行一段时间后,我得到了一些错误,比如分段错误,或者向量范围检查错误 它们大多发生在这一行: digitWeight[d->digit-1] += sum; 现在,您可以确定d->digit-1是该数组的有效范围。 问题在于d指针的值与此处不同: data * d = &entry.at(i); 它在函数执行过程中神奇地改变,并开始指向不同的数据,从而

现在,不需要分析函数本身——我确信它可以工作,我已经在一个线程上测试了它,它运行得很好。唯一的问题是,在执行一段时间后,我得到了一些错误,比如分段错误,或者向量范围检查错误

它们大多发生在这一行:

    digitWeight[d->digit-1] += sum;
现在,您可以确定
d->digit-1
是该数组的有效范围。 问题在于
d
指针的值与此处不同:

        data * d = &entry.at(i);
它在函数执行过程中神奇地改变,并开始指向不同的数据,从而导致错误。我曾尝试将
d->digit
的值保存到某个变量中,然后使用该变量,但在另一个共享资源
imageData
崩溃之前,该变量工作正常了一段时间

我认为这可能与数据共享有关——所有异步函数共享相同的数据数组——这是一个静态向量。但是这些数据只是读取的,没有写入任何地方,那么为什么它会停止工作呢?我知道一种叫做互斥锁的东西,但是锁定这个异步函数是没有意义的,因为它的运行速度和单线程程序的运行速度一样慢

我也尝试过运行如下功能:

  std::vector<std::thread*> threads(8);
  unsigned nptr = 0;
  int threadp = 0;
  while(nptr != network::networks.size()){
    threads.at(threadp) = new std::thread(&network::analyse, &network::networks.at(nptr), data, width, height, sw, dFnum.at(idx));
    threadp++;
    if(threadp == 8){
      threadp = 0;
      for(unsigned i = 0; i < 8; i++){
        if(threads.at(i)->joinable()) threads.at(i)->join();
        delete threads.at(i);
      }
    }
    nptr++;
  }
std::向量线程(8);
无符号nptr=0;
int-threadp=0;
while(nptr!=network::networks.size()){
threads.at(threadp)=新std::thread(&network::analysis,&network::networks.at(nptr),数据,宽度,高度,sw,dFnum.at(idx));
threadp++;
if(threadp==8){
threadp=0;
for(无符号i=0;i<8;i++){
if(threads.at(i)->joinable())threads.at(i)->join();
删除第(i)段;
}
}
nptr++;
}
它确实工作了一秒钟,但过了一段时间,一个非常类似的错误出现了。 数据是一个包含7个整数的结构,其中一个是 pattern,pattern是一个包含两个整数的类-宽度和高度 和字符向量

为什么它会发生在只读数据上?如何防止它

以下是发生的情况的示例:

请尝试创建一个实例来向我们展示,包括所有数组、向量和指针的声明和初始化(因此我们至少知道它们的大小)。此外,请在发生崩溃时运行调试器以捕获崩溃,这样您就可以在代码中找到它发生的位置(并在崩溃时检查所有变量的值)。同时用这些细节更新您的问题。什么是
digitwweight
?它是如何创建和/或初始化的?
d->digit
的值是多少?
d->digit-1
是否在
digitWeight
范围内?
digitWeight[d->digit-1]
是否已初始化?@Karol特别是,您不需要(也不应该)使用

换行符来创建段落。只需用空行分隔段落。顺便问一下,您使用的数据是否在线程之间共享?然后,您需要保护这些数据不受数据竞争的影响。
  std::vector<std::thread*> threads(8);
  unsigned nptr = 0;
  int threadp = 0;
  while(nptr != network::networks.size()){
    threads.at(threadp) = new std::thread(&network::analyse, &network::networks.at(nptr), data, width, height, sw, dFnum.at(idx));
    threadp++;
    if(threadp == 8){
      threadp = 0;
      for(unsigned i = 0; i < 8; i++){
        if(threads.at(i)->joinable()) threads.at(i)->join();
        delete threads.at(i);
      }
    }
    nptr++;
  }