同步线程的创建和(静态)对象的破坏

时间:2012-08-02 17:00:36

标签: c++ multithreading static

可怕的头衔,我知道,但(现在)我无法想出更好的东西


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

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(执行CreateDestroyConnection的引用计数器必须为1(只是静态指针应为非NULL))。

想法如何才能实现这一目标?

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


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

1 个答案:

答案 0 :(得分:1)

[来自问题的评论]

您可以在DoDisConnectDestroy之间插入线程障碍,以确保所有线程在DoDisconnect之前完成Destroy。要了解一些信息,您可以查看使用mutexcondition_variable的{​​{3}}。