从类析构函数中停止守护程序线程的“正确”方法

时间:2011-10-28 09:58:39

标签: multithreading termination

首先“正确”,因为我认为人们会告诉我从类中启动线程是一种不好的做法。 :) 所以我想知道在析构函数中停止无限线程的最佳方法是什么。在设置标志关闭时,线程在try中调用并抛出异常的包装函数?刚刚好老的int / enum?好新的std :: atomic int?别的什么? 现在我用:

//in destructor I call terminate member func
void terminate()
{
    currentStatus=terminating;
    std::cout<<"trying to kill"<<std::endl;
    while (currentStatus!=terminated)
        std::this_thread::yield();
    std::cout<<"MISSION ACOMPLISHED"<<std::endl;
}

线程运行的函数是:

while (currentStatus==active)
{
//...
}
currentStatus=terminated;

currentStatus是一个枚举:

enum status{
    active,
    terminating,
    terminated
};

1 个答案:

答案 0 :(得分:1)

'我认为人们会告诉我从类中启动线程是一种不好的做法 - 不管怎么说,不是我。如果你有OO语言,你还可以从以下地方开始:)

yield()循环存在问题。如果调用析构函数的线程具有比终止线程更高的优先级,那么您的设计可以永久锁定在单处理器系统上。即使在多核系统上,也可能会出现长时间的延迟。最好等待线程句柄或终止线程设置为退出前的最后一个操作的某些事件。这不仅可以消除可避免的CPU循环,还可以避免任何可能需要明确障碍的“状态”emum的缓存问题。

RGDS, 马丁