我正在尝试使用此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);
}