Mutex问题


互斥量(Mutex)
这两个互斥对象Mutex也不容忽视,这里应该是处理线程的同步--OpenMutex->CreateMutex->Lock->Unlock.......->ReleaseMutex(s_hmutexParameter)
补充:
1.   Mutex是一个令牌,当一个线程拿到这个令牌时运行,另外想拿到令牌的线程就必须等待,直到拿到令牌的线程释放令牌。没有所有权的线程是无法释放令牌的。
2.   Mutex(false,”string”)中的string是令牌的关键,或者可以叫令牌名,因为Mutex是跨进程的,整个系统中只会有唯一的令牌存在所以,
也就是说你在一个应用程序中的一个线程中得到了Mutex的所有权,那在另外一个线程(应该是进程)中的另外的线程想得到他就必须要等待。

互斥量包含的几个操作原语:
CreateMutex() 创建一个互斥量
OpenMutex() 打开一个互斥量
ReleaseMutex() 释放互斥量
WaitForMultipleObjects() 等待互斥量对象

同样MFC为互斥量提供有一个CMutex类。使用CMutex类实现互斥量操作非常简单,但是要特别注意对CMutex的构造函数的调用

 


CMutex( BOOL bInitiallyOwn = FALSE, LPCTSTR lpszName = NULL, LPSECURITY_ATTRIBUTES lpsaAttribute = NULL)


m_Mutex对应的是哪个Mutex?
m_Mutex.Lock();
m_Mutex.Unlock();

这样的定义一个CMutex对象,然后用该对象来Lock和Unlock,能达到什么效果?用对象名来代替互斥量名来标识
注意,同一个线程中不需要互斥量的使用;所以下面的是为了在不同的线程中调用而设置的。
应该是ClientOrderData中创建的子线程会有对uds_Order_Data_t对象操作的同步问题要用到CMutex来解决
D:/My Documents/Visual Studio Projects/ProjectInABC/Future FM/Future FM/Src_Data/ClientOrderData.cpp(27):  m_orderMutex.Lock();
D:/My Documents/Visual Studio Projects/ProjectInABC/Future FM/Future FM/Src_Data/ClientOrderData.cpp(29):  m_orderMutex.Unlock();
D:/My Documents/Visual Studio Projects/ProjectInABC/Future FM/Future FM/Src_Data/ClientOrderData.cpp(43): m_orderMutex.Lock();
D:/My Documents/Visual Studio Projects/ProjectInABC/Future FM/Future FM/Src_Data/ClientOrderData.cpp(53): m_orderMutex.Unlock();
D:/My Documents/Visual Studio Projects/ProjectInABC/Future FM/Future FM/Src_Data/ClientOrderData.h(26): CMutex m_orderMutex;

 

void COctOClientApp::LockParameter()
{
 WaitForSingleObject(s_hmutexParameter, INFINITE);还可以当作事件用来监听
}

void COctOClientApp::UnlockParameter()
{
 ReleaseMutex(s_hmutexParameter);
}

CloseHandle(s_hmutexParameter);OpenMutex和CreateMutex返回的都是HANDLE

// Mutex
HANDLE    s_hmutexParameter;
HANDLE    s_hmutexSocket;

// Create the mutex
CString strMutexName;

strMutexName.Format(_T("OctO_API_Client_Parameter_%d_MUTEX"), (LPARAM)this);//这个方法很有用

// Parameter
s_hmutexParameter = OpenMutex(MUTEX_ALL_ACCESS, FALSE, strMutexName);

if (NULL == s_hmutexParameter)
s_hmutexParameter = CreateMutex(NULL, FALSE, strMutexName);
else
{
 // already defined
 _ASSERTE(FALSE);
}

_ASSERTE(s_hmutexParameter);

// Socket
strMutexName.Format(_T("OctO_API_Client_Socket_%d_MUTEX"), (LPARAM)this);

s_hmutexSocket = OpenMutex(MUTEX_ALL_ACCESS, FALSE, strMutexName);

if (NULL == s_hmutexSocket)
s_hmutexSocket = CreateMutex(NULL, FALSE, strMutexName);
else
{
 // already defined
 _ASSERTE(FALSE);
}

_ASSERTE(s_hmutexSocket);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值