C ++线程中的SIGSEGV

时间:2019-07-17 20:23:00

标签: c++ multithreading threadpool mutex

我正在尝试使用此repository中的线程池。我的线程导致奇怪的运行时错误(SIGSEGV),我不明白导致该问题的原因。

我目前的做法

我创建了一些可以使用的线程池。然后,我将任务累积到队列中(例如在存储库描述中)。现在,我为每个线程创建自己的重要对象版本(例如代码中的窗口),并创建用于共享该对象的系统( ResourceGuard ResourceCollection )。但是ResourceGuard在所有线程中都是通用的,因此在获取项目时,我会锁定互斥锁。之后我解锁了互斥锁->出现错误后几毫秒。处理结束,退出代码139 (被信号11:SIGSEGV中断)

代码

bool State::generate_images(const std::string& dir, const std::string& extension)
    {
        //something
        for(int i = 0; i < this->texture_manager->size(); i++)
        {
            for(auto& var: paths)
            {
                std::future<bool> result = this->thread_pool->enqueue(&State::process_line, this,
                                                                      var, output, i,
                                                                      extension);
            }
        }

        return true;
    }

    bool State::process_line(const std::string& path_to_raw, const std::string& dir_to_save,
            int background_number, const std::string& extension) noexcept
    {
        mutex.lock();
        auto background_texture = this->texture_manager->get(background_number);
        auto window_guard = this->windows.getFree();
        mutex.unlock();

        sf::Sprite background;
        background.setTexture(background_texture);
        //some stuff with other variables

        for(auto& spr : sprites)
        {
            //some stuff with window_guard // in first line of this loop I got runtime error
        }

        window_guard.setStatus(false);
        return true;
    }

还有我的警卫密码

template <class T>
class ResourceGuard
{
public:
    explicit ResourceGuard(T obj);
    explicit ResourceGuard(std::shared_ptr<T>& obj_ptr);
    bool isUsed();
    void setStatus(bool use);
    std::shared_ptr<T> get();
private:
    bool used;
    std::shared_ptr<T> item;
};

template <class T>
    class ResourceCollection
    {
    public:
        ResourceGuard<T>& getFree();
        void push(T obj);
        void push(std::shared_ptr<T> obj_ptr);
    private:
        std::vector<ResourceGuard<T>> guards;
    };

    template<class T>
    ResourceGuard<T>& ResourceCollection<T>::getFree()
    {
        for(auto& guard : guards)
        {
            if(!guard.isUsed())
            {
                guard.setStatus(true);
                return guard;
            }
        }

        itl::Logger::Log(constants::thread::fail_distr_worker, itl::Logger::STREAM::BOTH, itl::Logger::TYPE::ERROR);
        exit(1);
    }

0 个答案:

没有答案