2017-11-18 6 views
2

ランダム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 

そして時にはさんが表示されませんENDL私を返します。

どうすれば修正できますか?私はいつも同じ変数randURLを使用しているので壊れていたと思うが、これを避ける方法はわからない。代わりに、同じ変数を使用しての、tryURLリターン URL作る

答えて

1

:次に

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

を、URLを返します非同期計算表すためにstd::future<std::string>のベクトルを作成します。

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()); 
} 
StackOverflowの上の
+0

このコードはVC17で動作しません。 launch_asyncはlaunch :: asyncに置き換えられましたが、コマンドを使用できませんでした。 修正できますか? – megapro17

+0

@ megapro17: 'consume'は単なる例です。それはあなたのロジックが行くべきところです。 –

0

他の質問には、いくつかの手がかりを提供します。

ランド()問題を修正する簡単な方法は、URLを生成することです。■メインスレッドとパスでそれらをスレッドに追加します。

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

OK、ランドを修正しました。私のプログラムはそれを4スレッドしか実行しません。なぜ私は得ることができません。私はもっ​​と試しましたが、一度に4つのスレッドしか実行されませんでした。また、私は4コアのCPUを持っています。for(int i = 0; i <100; ++ i){ \t \t \t thr [i] = thread(tryURL); \t \t} – megapro17

関連する問題