for_eachの並列インスタンスを実行するためのサンプルコードを書きました 以下のコードでスレッドに参加できません。私はコンカレントプログラミングには少し早いので、もしすべてのことを正しく行っているかどうかは分かりません。スレッドがfor_eachに参加できませんC++
template <typename Iterator, typename F>
class for_each_block
{
public :
void operator()(Iterator start, Iterator end, F f) {
cout << this_thread::get_id << endl;
this_thread::sleep_for(chrono::seconds(5));
for_each(start, end, [&](auto& x) { f(x); });
}
};
typedef unsigned const long int ucli;
template <typename Iterator, typename F>
void for_each_par(Iterator first, Iterator last, F f)
{
ucli size = distance(first, last);
if (!size)
return;
ucli min_per_thread = 4;
ucli max_threads = (size + min_per_thread - 1)/min_per_thread;
ucli hardware_threads = thread::hardware_concurrency();
ucli no_of_threads = min(max_threads, hardware_threads != 0 ? hardware_threads : 4);
ucli block_size = size/no_of_threads;
vector<thread> vf(no_of_threads);
Iterator block_start = first;
for (int i = 0; i < (no_of_threads - 1); i++)
{
Iterator end = first;
advance(end, block_size);
vf.push_back(std::move(thread(for_each_block<Iterator, F>(),first,end,f)));
first = end;
}
vf.push_back(std::move(thread(for_each_block<Iterator, F>(), first, last, f)));
cout << endl;
cout << vf.size() << endl;
for(auto& x: vf)
{
if (x.joinable())
x.join();
else
cout << "threads not joinable " << endl;
}
this_thread::sleep_for(chrono::seconds(100));
}
int main()
{
vector<int> v1 = { 1,8,12,5,4,9,20,30,40,50,10,21,34,33 };
for_each_par(v1.begin(), v1.end(), print_type<int>);
return 0;
}
上記のコードでは、スレッドは結合できません。私はまだ非同期的な未来を試していますが、私は同じことをまだ得ています。ここに何かがないのですか?
すべてのヘルプは大歓迎され、 はこれがno_of_threads
デフォルトの初期化スレッドを持つベクトルを作成します
ありがとう、それは今動作します。しかし、私は1つの問題があります。すべてのスレッドが同じIDを出力します。あなたはまたもっと提案することができますか(私は何か間違ったやり方をしたかもしれないと確信しています)。また、私はいつもpush_backとemplace_backのために混乱を感じました:) –
@KartikV 'this_thread :: get_id'は関数であり、呼び出す必要があります。今は関数ポインタの値を表示しています。 –
@Ocelot本当に、私はとても愚かな気がする。二人とも目を開けました。私は愚かな間違いを避けるために、はっきりと見えるべきです。君たちありがとう。 –