使用互斥信号量的时候,在线程结束时会自动释放占用的信号量:
- //
- // CopyRight(c) 2009, YOYO, All Rights Reserved.
- // Author: LIN YiQian
- // Created: 2009/09/16
- // Describe: 线程结束时会自动释放互斥量 演示
- //
- #include <Windows.h>
- #include <iostream>
- using namespace std;
- DWORD WINAPI ThreadFun(LPVOID lpParameter);
- HANDLE g_hMutex;
- void main(void)
- {
- g_hMutex = CreateMutex(NULL, FALSE, NULL);
- HANDLE hThread1 = CreateThread(NULL, 0, ThreadFun, new int(1), 0, NULL);
- HANDLE hThread2 = CreateThread(NULL, 0, ThreadFun, new int(2), 0, NULL);
- HANDLE hThread3 = CreateThread(NULL, 0, ThreadFun, new int(3), 0, NULL);
- CloseHandle(hThread1);
- CloseHandle(hThread2);
- CloseHandle(hThread3);
- CloseHandle(g_hMutex);
- system("pause");
- }
- DWORD WINAPI ThreadFun(LPVOID lpParameter)
- {
- WaitForSingleObject(g_hMutex, INFINITE);
- printf("Thread %d is running../n", *((int*)lpParameter));
- return NULL;
- }
但遇到像上一篇日志中出现问题的买票代码~就必须自己手工释放信号量 而不能等到线程结束了(废话 = =)。具体写法如下:
- //
- // CopyRight(c) 2009, YOYO, All Rights Reserved.
- // Author: LIN YiQian
- // Created: 2009/09/16
- // Describe: 线程手动申请释放互斥量 演示
- //
- #include <Windows.h>
- #include <iostream>
- using namespace std;
- DWORD WINAPI SellTickets(LPVOID lpParameter);
- int g_nTickets = 100;
- HANDLE g_hMutex;
- void main(void)
- {
- g_hMutex = CreateMutex(NULL, FALSE, NULL);
- HANDLE hThread1 = CreateThread(NULL, 0, SellTickets, new int(1), 0, NULL);
- HANDLE hThread2 = CreateThread(NULL, 0, SellTickets, new int(1), 0, NULL);
- HANDLE hThread3 = CreateThread(NULL, 0, SellTickets, new int(1), 0, NULL);
- CloseHandle(hThread1);
- CloseHandle(hThread2);
- CloseHandle(hThread3);
- Sleep(1000);
- CloseHandle(g_hMutex);
- system("pause");
- return;
- }
- DWORD WINAPI SellTickets(LPVOID lpParameter)
- {
- while (true)
- {
- WaitForSingleObject(g_hMutex, INFINITE);
- if (g_nTickets > 0)
- {
- printf("Thread %d sells ticket: No.%d/n", *((int*)lpParameter), g_nTickets--);
- }
- else
- {
- break;
- }
- ReleaseMutex(g_hMutex);
- }
- return NULL;
- }