0

糟糕的标题,我知道,但是(现在)我想不出更好的东西


假设我有几个对象,类的实例是这样的:

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和事实。如果有人有更好的主意,我可以稍微改变一下。ReconnectDoDisconnectConnectioFactory


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

4

1 回答 1

1

[来自问题的评论]

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

于 2012-08-03T09:01:17.407 回答