由错误间隔(2D阵列)引起的分段错误

时间:2018-05-17 22:45:04

标签: c++ arrays multithreading

我想学习线程是如何工作的,我试图创建一个程序,它将使用2个线程来复制图片(只是为了测试我新获得的线程技能)。但是我遇到了一个错误,可能是因为我的间隔(由间隔函数创建)仅对一维数组有效(我相信)。如何更改我的程序,以正确创建间隔,处理二维数组,如图片?

#include <iostream>
#include <vector>
#include <time.h>
#include <thread>
#include <mutex>
#include <png++/png.hpp>

std::mutex my_mutex;

std::vector<int> interval(int max, int n_threads)
{
    std::vector<int> intervallum;
    int ugras = max / n_threads;
    int maradek = max % n_threads;

    int n1 = 0;
    int n2;
    intervallum.push_back(n1);
    for (int i = 0; i < n_threads; i++)
    {
        n2 = n1 + ugras;
        if (i == n_threads - 1)
            n2 += maradek;
        intervallum.push_back(n2);
        n1 = n2;
    }
    return intervallum;
}

void create_image(png::image<png::rgb_pixel> image, png::image<png::rgb_pixel> new_image, int start, int end)
{
    std::lock_guard<std::mutex> lock(my_mutex);
    for (int i = start; i < end; i++)
        for (int j = start; j < end; j++)
        {
            new_image[i][j].red = image[i][j].red;
            new_image[i][j].blue = image[i][j].blue;
            new_image[i][j].green = image[i][j].green;
        }
}

int main()
{
    png::image<png::rgb_pixel> png_image("mandel.png");
    int image_size = png_image.get_width() * png_image.get_height();
    png::image<png::rgb_pixel> new_image(png_image.get_width(), png_image.get_height());
    time_t start, end;
    time(&start);

    int size = 2;
    std::vector<std::thread> threads;
    std::vector<int> stuff_interval = interval(image_size, size);

    for (int i = 0; i < size-1; i++)
        threads.push_back(std::thread(create_image, std::ref(png_image), std::ref(new_image), stuff_interval[i], stuff_interval[i + 1]));

    for (auto& i : threads)
        i.join();

    create_image(png_image,new_image,stuff_interval[size-2],stuff_interval[size-1]);

    new_image.write("test.png");
    time(&end);
    std::cout << (start - end) << std::endl;
    return 0;
}

1 个答案:

答案 0 :(得分:0)

好的,我找到了解决方法(这种方式我没有得到分段错误,但它没有正确复制图像,新图像是全黑的,这里是代码:

编辑:好像,我的图片错误,这就是为什么图片是黑色的。

constructor()