如何并行化一个使用某个变量的函数

时间:2017-11-18 21:23:09

标签: c++ multithreading

我有一个生成随机URL的函数,并尝试下载该文件。

void tryURL()
{
    randURL.clear();
    for (unsigned short i = 0; i < urlLength; i++)  {
    randURL = randURL + (alphabet[(int)((double)rand() / (RAND_MAX + 1) * alphabetLength)]);
    }
    wcout << randURL << endl;
    HRESULT getImg = URLDownloadToFile(NULL, LPCWSTR( (beginURL + randURL + endURL).c_str() ), LPCWSTR( (randURL + L"/" + endURL).c_str() ), 0, NULL);
    if (SUCCEEDED(getImg))
    {
    wcout << L"Success" << endl;
    }
}

如果我正常执行此功能,它可以正常工作:

tryURL();
0ybOAt
tryURL();
lTPKaR
tryURL();
Ivi05m
...

但是,我需要在那一刻重复运行此功能。 我试过这个:

thread threads[10];

for (int i = 0; i < 10; ++i) {
    threads[i] = thread(tryURL);
}

for (int i = 0; i < 10; ++i) {
    threads[i].join();
}

它总是给我相同的价值

0ybOAt0ybOAt
0ybOAt

0ybOAt0ybOAt

0ybOAt
0ybOAt0ybOAt
0ybOAt
0ybOAt

甚至有时候也不会表现出来。

我该如何解决?我认为,它因为总是使用相同的变量randURL而被打破,但我不知道如何逃避这一点。

2 个答案:

答案 0 :(得分:2)

不要使用相同的变量,而是让tryURL 返回网址:

// assuming that URLs are strings
std::string tryURL() { /* ... */ }

然后,创建一个std::future<std::string>向量来表示将返回URL的异步计算:

std::vector<std::future<std::string>>> futures;
futures.reserve(10);

for (int i = 0; i < 10; ++i) 
{
    futures.emplace_back(std::async(std::launch::async, tryURL));
}

最后,使用主线程中的URL:

for(auto& f : futures) 
{
    consume(f.get());
} 

答案 1 :(得分:0)

StackOverflow上的其他问题提供了一些线索:

rand()问题的一个简单修复是在主线程中生成URL:s并将它们传递给线程。

void tryURL(std::wstring URL)
...
// TODO: Set randURL to a random URL
threads[i] = thread(tryURL, randURL);