互斥量(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);