C++ 线程同步 (学习笔记)

1. 利用Mutex 互斥对象

#include <iostream.h> #include <windows.h> DWORD WINAPI Fun1Proc( LPVOID lpParameter ); DWORD WINAPI Fun2Proc( LPVOID lpParameter ); int tickets = 100; HANDLE hMutex; //互斥对象 int main() { HANDLE hThread1,hThread2; hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); hThread2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2); hMutex = CreateMutex(NULL,FALSE,NULL); Sleep(8000); return 1; } DWORD WINAPI Fun1Proc( LPVOID lpParameter ) { while (TRUE){ WaitForSingleObject(hMutex,INFINITE); //有信号时才返回 if(0 == tickets) break; cout<<"Thread1 sell tickets "<<tickets--<<endl; ReleaseMutex(hMutex);//释放互斥对象 } return 0; } DWORD WINAPI Fun2Proc( LPVOID lpParameter ) { while (TRUE){ WaitForSingleObject(hMutex,INFINITE); if(0 == tickets) break; cout<<"Thread2 sell tickets "<<tickets--<<endl; ReleaseMutex(hMutex);//释放互斥对象 } return 0; }

 

2. 利用Event 事件对象

#include <iostream.h> #include <windows.h> DWORD WINAPI Fun1Proc( LPVOID lpParameter ); DWORD WINAPI Fun2Proc( LPVOID lpParameter ); int tickets = 100; HANDLE hEvent; //事件 int main() { hEvent = CreateEvent(NULL,FALSE,FALSE,NULL); //创建事件 SetEvent(hEvent);//设置成有信号状态 HANDLE hThread1,hThread2; hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); hThread2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2); Sleep(8000); return 1; } DWORD WINAPI Fun1Proc( LPVOID lpParameter ) { while (TRUE){ WaitForSingleObject(hEvent,INFINITE); //事件有信号才返回 ResetEvent(hEvent); //设成无信号,以免其余线程访问 if(0 == tickets) break; cout<<"Thread1 sell tickets "<<tickets--<<endl; SetEvent(hEvent);//设为有信号,以供其余线程调用 } return 0; } DWORD WINAPI Fun2Proc( LPVOID lpParameter ) { while (TRUE){ WaitForSingleObject(hEvent,INFINITE); //事件有信号才返回 ResetEvent(hEvent); //设成无信号,以免其余线程访问 if(0 == tickets) break; cout<<"Thread2 sell tickets "<<tickets--<<endl; SetEvent(hEvent);//设为有信号,以供其余线程调用 } return 0; }

 

3. 利用临界区 CRITICAL_SECTION 效率更高

#include <iostream.h> #include <windows.h> DWORD WINAPI Fun1Proc( LPVOID lpParameter ); DWORD WINAPI Fun2Proc( LPVOID lpParameter ); int tickets = 100; CRITICAL_SECTION cs;//临界区 int main() { InitializeCriticalSection(&cs); //初始化临界区 HANDLE hThread1,hThread2; hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); hThread2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2); Sleep(8000); return 1; } DWORD WINAPI Fun1Proc( LPVOID lpParameter ) { while (TRUE){ EnterCriticalSection(&cs); //进入临界区 if(0 == tickets) break; cout<<"Thread1 sell tickets "<<tickets--<<endl; LeaveCriticalSection(&cs); //离开临界区 } return 0; } DWORD WINAPI Fun2Proc( LPVOID lpParameter ) { while (TRUE){ EnterCriticalSection(&cs); //进入临界区 if(0 == tickets) break; cout<<"Thread2 sell tickets "<<tickets--<<endl; LeaveCriticalSection(&cs); //离开临界区 } return 0; }

 

 

转载于:https://www.cnblogs.com/JarvisChu/archive/2010/08/06/2752545.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值