封装互斥类出错,求助(利用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、临界区是用户态的东西,即只是一块内存,因此拷贝构造函数默认那个就够了。这点倒是挺方便的。如果要写,就是内存拷贝或者直接用=号系统自动位拷贝。