确保回调对象的线程安全的最佳/最佳方法是什么?具体来说,我试图防止在所有线程完成回调对象之前对其进行解构。

编写客户端代码以确保线程安全很容易,但是我正在寻找一种更简化的方法。例如,使用工厂对象生成回调对象。那么麻烦就在于跟踪回调对象的使用情况。

以下是我要改进的示例代码。

class CHandlerCallback
{
public:
     CHandlerCallback(){  ...  };
     virtual ~CHandlerCallback(){  ...  };
     virtual OnBegin(UINT nTotal ){  ...  };
     virtual OnStep (UINT nIncrmt){  ...  };
     virtual OnEnd(UINT nErrCode){  ...  };

protected:
      ...
}

static DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
    CHandler* phandler = (CHandler*)lpParameter;
    phandler ->ThreadProc();
    return 0;
};

class CHandler
{
public:
    CHandler(CHandlerCallback * sink = NULL) {
        m_pSink = sink;
        // Start the server thread. (ThreadProc)
    };
    ~CHandler(){...};

    VOID ThreadProc(LPVOID lpParameter) {
       ... do stuff
       if (m_pSink) m_pSink->OnBegin(..)
       while (not exit) {
           ... do stuff
           if (m_pSink) m_pSink->OnStep(..)
           ... do stuff
       }
       if (m_pSink) m_pSink->OnEnd(..);
    };

private:
    CHandlerCallback * m_pSink;
}

class CSpecial1Callback: public CHandlerCallback
{
public:
     CSpecial1Callback(){  ...  };
     virtual ~CBaseHandler(){  ...  };
     virtual OnStep (UINT nIncrmt){  ...  };
}

class CSpecial2Callback: public CHandlerCallback...


然后,以类似于以下方式的方式运行所有内容的代码:

int main {
   CSpecial2Callback* pCallback = new CSpecial2Callback();
   CHandler handler(pCallback );
   // Right now the client waits for CHandler to finish before deleting
   // pCallback
}


谢谢!

最佳答案

如果您使用的是C ++ 11,则可以使用智能指针将对象保留在周围,直到对该对象的最后一个引用消失为止。请参见shared_pointer。如果您不在C ++ 11中,则可以使用boost's version。如果您不想包含该库并且不在C ++ 11中,则可以使用该对象维护线程的内部计数,并在该计数达到0时销毁该对象。请注意,您自己尝试跟踪计数器可能会很困难,因为您需要对计数器进行原子更新。

shared_ptr<CSpecial2Callback> pCallback(new CSpecial2Callback());
CHandler handler(pCallback); // You'll need to change this to take a shared_ptr
... //Rest of code -- when the last reference to
... //pCallback is used up it will be destroyed.

关于c++ - 保护回调函数免受解构类影响的最佳方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20102391/

10-11 23:00
查看更多