如何销毁线程并正确销毁对象?

时间:2021-04-25 09:27:25

标签: c++ windows

最近遇到一个关于线程和销毁的问题。

这是一个示例,我使用 Visual Studio 2019 在 Windows 10 上运行我的代码:

class A
{
public:
    A() { num = 100; }
    ~A() {}
    int getNum() { return num; }
private:
    int num;
};
class B
{
public:
    B() { a = new A(); }
    ~B() { delete a; }
    void start()
    {
        std::thread t(std::mem_fn(&B::func), std::ref(*this));
        t.detach();
    }
    void func()
    {
        while (flag)
        {
            std::cout << a->getNum() << std::endl;
            std::this_thread::sleep_for(std::chrono::milliseconds(2000));
        }
    }
    void stop()
    {
        flag = false;
    }
private:
    A* a;
    bool flag = true;
};

int main()
{
    B* b = new B();
    b->start();
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
    b->stop();
    delete b;

    while (true)
    {
        // other codes
    }
}

这里我调用了 b->stop()flag 设置为 false。然后我delete B,所以成员a被删除。但是,由于 std::this_thread::sleep_for(2000) 函数,线程 t 不会停止。然后它会出现错误。

我尝试添加睡眠标志:

    void func()
    {
        while (flag)
        {
            std::cout << a->getNum() << std::endl;
            sleepFlag = true;
            std::this_thread::sleep_for(std::chrono::milliseconds(2000));
            sleepFlag = false;
        }
    }
    void stop()
    {
        flag = false;
        while (sleepFlag)
            std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }

它有效。 delete b 将等待 b->stop() 完成。所以线程会在 delete a 之前停止。但是如果我有 10 个 B 的指针,也许我会等待 20 秒!那不是我想要的。 如何停止线程 t 并正确销毁对象 b

0 个答案:

没有答案