MFC线程(三):线程同步事件(event)与互斥(mutex)
前面讲了临界区可以用来达到线程同步.而事件(event)与互斥(mutex)也同样可以做到.
Win32 API中的线程事件
HANDLE hEvent = NULL;
void MainTestFun{
hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
SetEvent(hEvent);
char g_charArray[4];
CString szResult;
//下面三个线程中的任意一个访问g_charArray的时候其他线程都不能访问
AfxBeginThread(FunOne,NULL); //FunOne给数组赋值全为S
AfxBeginThread(FunTwo,NULL); //FunTwo也给数组赋值全为B
AfxBeginThread(GetResult,); //返回BBBB
}
//其他两个函数FunOne或GetResult也同样添加两行这样的代码.这两函数的定义见上一篇http://blog.csdn.net/weiwenhp/article/details/8650896
UINT FunOne(LPVOID pParam){
WaitForSingleObject(hEvent, INFINITE); //类似EnterCriticalSection,这里的INFINITE表示会一直等其他的线程执行完了再执行.如果写成1000则表示只等1秒钟.1秒内
//其他线程还没有释放资源则该线程自动中止.
for(int i =0; i < 4; i++){
g_charArray[i] = 'S';
Sleep(1);
}
SetEvent(hEvent); //类似LeaveCriticalSection
return 0;
}
MFC中的线程事件类
CEvent g_cEvent; //实例化一个事件类
void MainTestFun{
g_cEvent.SetEvent();
char g_charArray[4];
CString szResult;
//下面三个线程中的任意一个访问g_charArray的时候其他线程都不能访问
AfxBeginThread(FunOne,NULL); //FunOne给数组赋值全为S
AfxBeginThread(FunTwo,NULL); //FunTwo也给数组赋值全为B
AfxBeginThread(GetResult,); //返回BBBB
}
//其他两个函数FunOne或GetResult也同样添加两行这样的代码.这两函数的定义见上一篇http://blog.csdn.net/weiwenhp/article/details/8650896
UINT FunOne(LPVOID pParam){
WaitForSingleObject(g_cEvent, INFINITE); //类似EnterCriticalSection
//其他线程还没有释放资源则该线程自动中止.
for(int i =0; i < 4; i++){
g_charArray[i] = 'S';
Sleep(1);
}
g_cEvent.SetEvent(); //类似LeaveCriticalSection
return 0;
}
Win32 API中的互斥(mutex)
HANDLE hMutex = NULL;
void MainTestFun{
hMutex= CreateMutex(NULL,FALSE,NULL);
char g_charArray[4];
CString szResult;
//下面三个线程中的任意一个访问g_charArray的时候其他线程都不能访问
AfxBeginThread(FunOne,NULL); //FunOne给数组赋值全为S
AfxBeginThread(FunTwo,NULL); //FunTwo也给数组赋值全为B
AfxBeginThread(GetResult,); //返回BBBB
}
//其他两个函数FunOne或GetResult也同样添加两行这样的代码.这两函数的定义见上一篇http://blog.csdn.net/weiwenhp/article/details/8650896
UINT FunOne(LPVOID pParam){
WaitForSingleObject(hMutex, INFINITE);//类似EnterCriticalSection,这里的INFINITE表示会一直等其他的线程执行完了再执行.如果写成1000则表示只等1秒钟.1秒内
//其他线程还没有释放资源则该线程自动中止.
for(int i =0; i < 4; i++){
g_charArray[i] = 'S';
Sleep(1);
}
ReleaseMutex(hMutex );//类似LeaveCriticalSection
return 0;
}
MFC中的互斥类(CMutex)
CMutex g_cMutex;
void MainTestFun{
char g_charArray[4];
CString szResult;
//下面三个线程中的任意一个访问g_charArray的时候其他线程都不能访问
AfxBeginThread(FunOne,NULL); //FunOne给数组赋值全为S
AfxBeginThread(FunTwo,NULL); //FunTwo也给数组赋值全为B
AfxBeginThread(GetResult,); //返回BBBB
}
//其他两个函数FunOne或GetResult也同样添加两行这样的代码.这两函数的定义见上一篇http://blog.csdn.net/weiwenhp/article/details/8650896
UINT FunOne(LPVOID pParam){
g_cMutex.Lock();//类似EnterCriticalSection,这里的INFINITE表示会一直等其他的线程执行完了再执行.如果写成1000则表示只等1秒钟.1秒内
//其他线程还没有释放资源则该线程自动中止.
for(int i =0; i < 4; i++){
g_charArray[i] = 'S';
Sleep(1);
}
g_cMutex.Unlock();//类似LeaveCriticalSection
return 0;
}