同步线程创建和销毁(静态)对象

Synchronize threads' creation and destruction of (static) object

本文关键字:静态 对象 线程 创建 同步      更新时间:2023-10-16

我知道这个标题很糟糕,但(目前)我无法想出更好的东西


假设我有几个对象,类的实例如下:

class MyWorker: public Thread
{
public:
    void Reconnect(...);
    //...
private:
    void DoDisconnect();
    ConnectionPtr m_ptrConnection;
};

这些对象中的每一个都是独立的线程。ConnectionPtr是一个引用计数智能指针。

Reconnect首先执行DoDisconnect,它只是取消m_ptrConnection(以减少参考计数器),然后执行ConnectionFactory::Create:

class ConnectionFactory
{
private:
    ConnectionFactory();
public:
    ConnectionPtr Create( ... );
private:
    //...
    void Destroy();
    static m_mutex;
    static ConnectionPtr m_ptrConnection;
};

这里,Create( ... )调用Destroy(),然后重新初始化m_ptrConnection成员并将其作为结果返回。

其想法是,MyWorker的所有实例都将使用相同的Connection(这到底是什么并不重要)。

问题如下:MyWorker的所有实例必须首先调用其DoDisconnect(以减少引用计数器),然后执行Create(当Create执行Destroy时,Connection的引用计数器必须为1(仅静态指针应为非NULL))。

想法我如何才能做到这一点?

我知道,这听起来像是一个糟糕的设计和"过于本地化"。我不能改变MyWorker的设计以及Reconnect首先调用DoDisconnect的事实。如果有人有更好的想法,我可以稍微改变ConnectioFactory的设计


当前,我锁定静态mutex以同步对m_ptrConnection的访问。如果CCD_ 24已经被其他线程重新初始化,则CCD_
唯一的问题是,如何确保所有MyWorker线程都先执行了它们的DoDisconnect?以某种方式使用第二个mutex?或者一些静态线程安全(原子)计数器

[来自问题评论]

您可以在DoDisConnectDestroy之间插入线程屏障,以确保所有线程都在Destroy之前完成了DoDisconnect。为了获得一些想法,您可以查看使用mutexcondition_variable的boost实现。