我写了一个示例代码来运行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;
}
在上面的代码中,我得到线程无法连接。我也试过异步期货,但我仍然保持一致。我在这里错过了什么吗?
任何帮助是极大的赞赏, 预先感谢您..
非常感谢,它现在有效。但我有一个问题。所有线程都打印相同的ID。你也可以请建议更多(我确定我可能做错了一些事情)。另外,我总是对push_back和emplace_back感到困惑,谢谢澄清:) –
@KartikV'this_thread :: get_id'是一个函数,它应该被调用。现在你正在打印函数指针值。 –
@豹子如此真实,我感到很愚蠢。你们两个都睁开了眼睛。我应该仔细观察以避免愚蠢的错误。感谢你们。 –