for (int i = 0; i < 16; i++)
{
thread myThread(compute_mandelbrot, -2.0, 1.0, 1.125, -1.125, ystart, yend);
ystart = ystart + 30;
yend = yend + 30;
myThread.join();
}
我基本上想要并行运行16个线程,每个线程渲染一个mandelbrot图像。我不知道如何实现这是在for循环中,因为我必须等待线程在创建新线程之前完成。
我是否有办法在不必一个接一个地创建16个线程的情况下运行并行线程?
答案 0 :(得分:6)
嗯,显然你需要在保持跟踪的同时异步运行它们:
// DISCLAIMER: not a real production code
std::vector<std::thread> workers;
// first start them all
for(std::size_t i{}; i < 16; ++i, ystart += 30, yend += 30) {
workers.emplace_back(compute_mandelbrot, -2.0, 1.0, 1.125, -1.125, ystart, yend);
}
// now join them all
for(auto &w: workers) w.join();
答案 1 :(得分:4)
您需要在调用std::thread
之前创建所有join()
,否则您在等待线程终止之前才开始下一个。
一种简单的方法是将线程存储在数组中:
constexpr size_t nthreads = 16;
std::array<std::thread, nthreads> threads;
// fill the array with threads
for (auto &thread: threads) {
thread = std::thread(compute_mandelbrot, -2.0, 1.0,
1.125, -1.125, ystart, yend);
ystart = ystart + 30;
yend = yend + 30;
}
// join everything
for (auto &thread: threads) {
thread.join();
}
答案 2 :(得分:0)
我使用最简单的表示法创建了一个线程数组,我可以使用创建所有16个线程,然后将另外16个线程连接到另一个for循环中。
for (int i = 0; i < 16; i++, ystart += 30, yend += 30)
{
threadArr[i] = thread(compute_mandelbrot, -2.0, 1.0, 1.125, -1.125, ystart, yend);
}
for (int i = 0; i < 16; i++)
{
threadArr[i].join();
}