我正在尝试编写一个ResourceCach,它应该有一个加载和卸载不同类型对象的线程。我开始的想法是将一个线程作为成员变量和一个std::string
列表,其中表示要加载/卸载的文件的路径。所以还有一个名为work()的方法应该由线程执行。但是好好谈谈。
问题是: 如何在构造函数中初始化线程?
·H
class ResourceCach
{
public:
ResourceCach();
~ResourceCach();
void init();
bool stopThread();
void load(std::string path);
void unload(std::string path);
private:
thread m_worker; // ptr? reference? which would be right?
vector<std::string> m_toLoad;
vector<std::string> m_toUnload;
void work();
};
cpp应该是这样的(这不起作用)
ResourceCach::ResourceCach()
{
init();
}
ResourceCach::~ResourceCach()
{
}
void ResourceCach::init()
{
m_worker(ResourceCach::work, "ResourceCach-Thread");
}
void ResourceCach::work(){
}
bool ResourceCach::stopThread(){
if (m_worker.joinable())
{
m_worker.join();
return true;
}
else
{
return false;
}
}
我们正在谈论std::thread
。那我该怎么做呢?这是一种很好的方式&#34;开始这个?
答案 0 :(得分:2)
您可以在初始化列表中以通常的方式初始化它:
ResourceCach::ResourceCach() : m_worker([this]{work();}) {}
但是,如果你这样做,你应该最后声明它,以确保在线程可以访问它们之前初始化所有其他成员变量。
如果你想推迟它,那么让它默认初始化,然后再移动另一个线程:
m_worker = std::thread([this]{work();});
注意:我假设它是std::thread
,尽管您尝试调用的构造函数看起来不标准。如果它是一些非标准的线程类型,那么这个答案可能不适用。