gpt4 book ai didi

c++ - 如果我不在发布版本中加入 "destruction"上的线程怎么办?

转载 作者:行者123 更新时间:2023-11-27 22:30:09 27 4
gpt4 key购买 nike

在很多情况下,我的类都像事件对象(有一个线程)。为了避免访问冲突,我总是必须在析构函数中等待加入。这通常不是问题。

然而,想象一下发布版本有一些错误(死锁、活锁等)导致 join() 不能按时返回或根本不返回,这将导致整个应用程序无法运行,同时等待一个不会被再次使用的对象。如果这种情况发生在客户身上,就会成为一个问题。

我宁愿被问题通知并跳过加入。并泄漏线程及其资源。

跳过连接可以通过这样的方式实现。

   class MyActiveObject
{
public:
MyActiveObject();
~MyActiveObject(){}
private
struct Implementation;
std::shared_ptr<Implementation> pImpl_;
};

struct MyActiveObject::Implementation : std::enable_shared_from_this<Implementation >
{
Implementation() : thread_([=]{Run();})
{
}

~Implementation()
{
#ifdef _DEBUG
thread_.join();
#else
if(!thread_.timed_join(SOME_TIMEOUT))
ALERT_SOME_HOW();
#endif
}

void Dispose()
{
isRunning_ = false;
}

void Run()
{
#ifndef _DEBUG
auto pKeepAlive = shared_from_this(); // Won't be destroyed until thread finishes
#endif
isRunning_ = true;
while(isRunning_)
{
/* ... */
}
}

boost::thread thread_;
tbb::atomic<bool> isRunning_;
};

MyActiveObject::MyActiveObject() : pImpl_(new Implementation()){}
MyActiveObject::~MyActiveObject() { pImpl_->Dispose(); }

这是个好主意吗?或者有更好的策略吗?

最佳答案

奇怪的问题:“如果我的代码中有错误,我就会遇到问题”。嗯,是。修复错误,不要试图掩盖它。那种论文只会产生两个错误,因为在知道第一个错误是什么之前无法对其进行测试。

关于c++ - 如果我不在发布版本中加入 "destruction"上的线程怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3669940/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com