我需要生成一堆随机数,并从不同的线程使用(读取)它们。这是我生成数字的方法:
const std::vector<double>* Test::getRandomDoubles(int count)
{
std::vector<double>* numbers = new std::vector<double>();
numbers->reserve(count);
for (int i = 0; i < itemsCount; i++)
{
srand((int)std::chrono::high_resolution_clock::now().time_since_epoch().count());
numbers->emplace_back(rand() / 1000);
}
return numbers;
}
但是我在某些时候丢失了数字:std::future<void> SomeMethod(const std::vector<double>& numbers)
{
return std::async( // breakpoint: numbers are available when creating the future.
std::launch::async,
[&]()
{ // breakpoint: numbers gone. <-
// Use numbers
如果有帮助,我可以这样调用SomeMethod:// Just want to run some test for SomeMethod.
std::vector<void> futures;
for(int i = 0; i < 10; i++)
{
std::vector<double> numbers = *getRandomDoubles(count);
futures.emplace_back(SomeMethod(numbers));
}
for(int i = 0; i < 10; i++)
{
futures[i].get();
}
目前,我并未在代码中的任何位置调用delete。我应该怎么做才能在异步lambda中包含数字?
最佳答案
您有责任确保lambda不会超过其通过引用捕获的变量。
如果从函数返回一个lambda,那么在调用它时,它捕获的局部变量早就死了。如果您异步运行它并返回future,则会发生相同的情况。
解决此问题的一种方法是通过copy或by move捕获。
顺便说一句,getRandomDoubles()
应该而不是调用new
并返回一个指针。 C++不是Java。写
std::vector<double> Test::getRandomDoubles(int count) {
std::vector<double> numbers;
...
return numbers;
}