0

首先是“正确的”,因为我想人们会告诉我从类中启动线程是一种不好的做法。:) 所以我想知道在析构函数中停止无限线程的最佳方法是什么。在设置标志关闭时包装线程在尝试中调用并抛出异常的函数?只是好的旧整数/枚举?好的新 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
};
4

1 回答 1

1

'我想人们会告诉我,从课堂上启动线程是一种不好的做法'——反正不是我。如果你有 OO 语言,你还会从哪里开始呢 :)

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

Rgds,马丁

于 2011-10-28T21:26:42.157 回答