C++ 基于承诺数组的故障分割

C++ 基于承诺数组的故障分割,c++,multithreading,c++11,future,C++,Multithreading,C++11,Future,我已经编写了多线程程序,使用Promissions和futures来检查给定的数字是否为素数。这个程序的正确性或效率不是一个问题,而是每次执行时都会出现分段错误的事实——我对更复杂的程序也有类似的问题,所以我写了这个简单的程序来理解它,错误仍然存在。也许我不了解并发性,或者承诺/未来,但我认为这里的一切都是以正确的方式完成的。。。有人能解释为什么它不起作用吗?这将非常有帮助: 代码如下: 包括 包括 包括 包括 包括 包括 名称空间{ const int THREADS_NUMBER=8; 无效

我已经编写了多线程程序,使用Promissions和futures来检查给定的数字是否为素数。这个程序的正确性或效率不是一个问题,而是每次执行时都会出现分段错误的事实——我对更复杂的程序也有类似的问题,所以我写了这个简单的程序来理解它,错误仍然存在。也许我不了解并发性,或者承诺/未来,但我认为这里的一切都是以正确的方式完成的。。。有人能解释为什么它不起作用吗?这将非常有帮助:

代码如下:

包括 包括 包括 包括 包括 包括 名称空间{ const int THREADS_NUMBER=8; 无效fint n,std::向量和除数,std::promise和isPossiblePrime{ bool isPrimeCandidate=true; 对于自动i:除数 如果n%i==0{ isPrimeCandidate=false; 打破 } isPossiblePrime.set_值isPrimeCandidate; } } int main{ int n; 标准:cin>>n; 资产n>2; 承诺承诺[线程数]; 标准::未来期货[线程数]; 对于int i=0;iifisPrime std::cout问题是由以下行引起的:对于int i=0;i线程数,则它尝试读取/写入未分配的promissions/futures。

问题发生在:

for (int i = 0; i < THREADS_NUMBER; i++) 
    threads[i] = std::thread{ [&]() { f(n, divisiors[i], promises[i]); }};
然后每个lambda使用i的值,就像创建lambda时一样


注意:我认为std::thread可以使用临时lambda作为构造函数参数,但也不确定。标准似乎说线程构造函数复制了提供的functor。但是我搜索的所有cppreference示例都首先创建了一个命名lambda,然后将该名称作为构造函数参数对于STD::/p>甚至在n=ththssSynSype时,它仍然给出了Sebug,我也注意到了。@ M.M,我想下面的答案是关于我的引用是解决核心问题的,谢谢,我自己永远不会发现它实际上花费了大约8个小时在这个问题上,没有效果。我从来没有在C++中使用过lambda。,但他们很直截了当地看着我,所以我没想到这会成为一个问题:再次感谢!@saida我花了很长时间才弄清楚发生了什么!
threads[i] = std::thread{ [&,i]() { f(n, divisiors[i], promises[i]); }};