如何在for循环中运行并行线程(C ++)

时间:2018-02-09 13:27:57

标签: c++ multithreading

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个线程的情况下运行并行线程?

3 个答案:

答案 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();
}