我需要生成一堆随机数,并从不同的线程使用(读取)它们。这是我生成数字的方法:

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;
}

08-05 04:04
查看更多