init一个线程,它是构造函数中的成员变量

时间:2014-04-22 12:48:57

标签: c++ multithreading constructor

我正在尝试编写一个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;开始这个?

1 个答案:

答案 0 :(得分:2)

您可以在初始化列表中以通常的方式初始化它:

ResourceCach::ResourceCach() : m_worker([this]{work();}) {}

但是,如果你这样做,你应该最后声明它,以确保在线程可以访问它们之前初始化所有其他成员变量。

如果你想推迟它,那么让它默认初始化,然后再移动另一个线程:

m_worker = std::thread([this]{work();});

注意:我假设它是std::thread,尽管您尝试调用的构造函数看起来不标准。如果它是一些非标准的线程类型,那么这个答案可能不适用。