首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

封装互斥类出错,(利用Critical Section)

2012-08-03 
封装互斥类出错,求助(利用Critical Section)在wtl工程中,由于多线程共同读写共享变量,所以自己写了个封装C

封装互斥类出错,求助(利用Critical Section)
在wtl工程中,由于多线程共同读写共享变量,所以自己写了个封装Critical Section api 的工具类

想实现:进入某个函数时加锁,离开函数时自动解锁,以防止自己忘记UnLock导致死锁。

所以代码如下:

C/C++ code
/* 互斥类实现 */class CMutexImpl{public:    CMutexImpl() {InitializeCriticalSection(&m_cs);}    CMutexImpl(CMutexImpl &mutex){/*这个地方代码要如何实现*/}    virtual ~CMutexImpl() {DeleteCriticalSection(&m_cs);}    void Lock() {EnterCriticalSection(&m_cs);}    void UnLock() {LeaveCriticalSection(&m_cs);}private:    CRITICAL_SECTION m_cs;};/* 友好的互斥类 */class CFriendlyMutex{public:    /*explicit*/ CFriendlyMutex(CMutexImpl &mutex):m_MutexImpl(mutex)    {        TRACE("******LOCK");        mutex.Lock();    }    virtual ~CFriendlyMutex()     {        TRACE("******UNLOCK");        m_MutexImpl.UnLock();     }private:    CMutexImpl m_MutexImpl;};



在对话框程序中CCriticalSectionDemoDlg声明
private:
  CMutexImpl m_Mutex;
public:
  friend UINT Global_ThreadTest( LPVOID pParam );

声明全局变量:CString g_str = "shared with all.";
BOOL bFlag = TRUE; // TRUE: + ; FALSE - ;

线程函数:
C/C++ code
UINT Global_ThreadTest( LPVOID pParam ){    /* ------------------------------------- */    CFriendlyMutex mutex(m_Mutex);   //进入函数时加锁,离开函数时利用作用域特点,自动解锁                                          //但是有错误,提示m_Mutex未找到,按照我的理解Global_ThreadTest 是                                          //friend 函数,为什么访问不到private m_Mutex;    CEdit *pEdit = (CEdit *)pParam;    pEdit->SetWindowText("");        int iPos = g_str.Find(".");    g_str = g_str.Left(iPos + 1);    pEdit->SetWindowText(g_str);    for (int i = 0; i != 20; ++i)    {        if (!bFlag){            g_str += "-";        }         else{            g_str += "+";        }                pEdit->SetWindowText(g_str);        Sleep(500);    }        if (!bFlag){        bFlag = TRUE;    }     else{        bFlag = FALSE;    }    TRACE(g_str);    return 0;    /* ------------------------------------- */}



最后启动2个线程:
C/C++ code
void CCriticalSectionDemoDlg::OnBtnTest() {    // TODO: Add your control notification handler code here    CWinThread *pTest1 = AfxBeginThread(Global_ThreadTest, &m_Test,        THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);    pTest1->ResumeThread();    CWinThread *pTest2 = AfxBeginThread(Global_ThreadTest, &m_Test,        THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);     pTest2->ResumeThread();}


[解决办法]
取消CMutexImpl(CMutexImpl &mutex)

 CFriendlyMutex(CMutexImpl &mutex)改成 CFriendlyMutex(CMutexImpl *mutex)
[解决办法]
1、m_Mutex访问不到,因为作用域内没有CCriticalSectionDemoDlg 对象,也就无法访问这个对象的私有函数了,friend只是说明了权限,你没定义对象肯定不行,建议把dlg的指针传给线程函数就行了

2、临界区是用户态的东西,即只是一块内存,因此拷贝构造函数默认那个就够了。这点倒是挺方便的。如果要写,就是内存拷贝或者直接用=号系统自动位拷贝。

热点排行