MFC线程(三):线程同步事件(event)与互斥(mutex)
2013-07-12 09:41
405 查看
前面讲了临界区可以用来达到线程同步.而事件(event)与互斥(mutex)也同样可以做到.
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;
}
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([b]g_cEvent, INFINITE); //[/b]类似EnterCriticalSection
//其他线程还没有释放资源则该线程自动中止.
for(int i =0; i < 4; i++){
g_charArray[i] = 'S';
Sleep(1);
}
[b]g_cEvent.SetEvent(); //[/b]类似LeaveCriticalSection
return 0;
}
void MainTestFun{
[b]hMutex= CreateMutex(NULL,FALSE,NULL);[/b]
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([b]hMutex, INFINITE);//[/b]类似EnterCriticalSection,这里的INFINITE表示会一直等其他的线程执行完了再执行.如果写成1000则表示只等1秒钟.1秒内
//其他线程还没有释放资源则该线程自动中止.
for(int i =0; i < 4; i++){
g_charArray[i] = 'S';
Sleep(1);
}
ReleaseMutex(hMutex );//类似LeaveCriticalSection
return 0;
}
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;
}
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([b]g_cEvent, INFINITE); //[/b]类似EnterCriticalSection
//其他线程还没有释放资源则该线程自动中止.
for(int i =0; i < 4; i++){
g_charArray[i] = 'S';
Sleep(1);
}
[b]g_cEvent.SetEvent(); //[/b]类似LeaveCriticalSection
return 0;
}
Win32 API中的互斥(mutex)
HANDLE hMutex = NULL;void MainTestFun{
[b]hMutex= CreateMutex(NULL,FALSE,NULL);[/b]
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([b]hMutex, INFINITE);//[/b]类似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;
}
相关文章推荐
- MFC线程(三):线程同步事件(event)与互斥(mutex)
- MFC线程(三):线程同步事件(event)与互斥(mutex)
- Mutex与Event控制互斥事件的使用详解
- Mutex与Event控制互斥事件的使用详解
- 线程的同步互斥之事件对象(Event)
- 4.[个人]C++线程入门到进阶(4)----线程同步之事件Event
- 线程的创建、管理 与 使用信号灯、互斥量、临界区、事件进行线程同步或互斥
- MFC(4) MFC中使用事件(event)来线程同步
- Mutex与Event控制互斥事件的使用详解
- 如何在基于 MFC 的 ActiveX 控件激发事件,在 Visual c + + 中的启动另一个线程
- [C# 线程处理系列]专题六:线程同步——事件构造
- 多线程基础之三:使用event, mutex, semaphore实现多进程间互斥
- Swing中至少运行两个线程…………关于事件分发线程Event-dispatching thred
- [C# 线程处理系列]专题五:线程同步——事件构造
- 线程同步互斥之互斥量(Mutex)
- python基础-信号量Semaphore(进程_线程)、事件Event(进程_线程)
- 利用事件同步,互斥线程
- 线程同步,互斥 事件 和关键代码的比较
- 线程同步之事件对象(类比互斥对象进行分析)
- c# 线程同步: 详解lock,monitor,同步事件和等待句柄以及mutex