这是个有趣的问题,直接上代码:
#include <windows.h> #include <iostream.h> HANDLE g_h1 = NULL; HANDLE g_h2 = NULL; int g_m = 0; int g_n = 0; void init() { g_h1 = CreateSemaphore(NULL, 1, 1, NULL); g_h2 = CreateSemaphore(NULL, 0, 100, NULL); } void addToQueque() { WaitForSingleObject(g_h1, INFINITE); cout << "addToQueque--------->" << ++g_m << endl; ReleaseSemaphore(g_h1, 1, NULL); ReleaseSemaphore(g_h2, 1, NULL); } void delFromQueue() { WaitForSingleObject(g_h1, INFINITE); WaitForSingleObject(g_h2, INFINITE); cout << "delFromQueue : " << ++g_n << endl; ReleaseSemaphore(g_h1, 1, NULL); } DWORD WINAPI ThreadProc1(LPVOID pVoid) { int i = 0; for(i = 0; i < 100; i++) { addToQueque(); } return 0; } DWORD WINAPI ThreadProc2(LPVOID pVoid) { int i = 0; for(i = 0; i < 100; i++) { delFromQueue(); } return 0; } int main() { init(); HANDLE hThread[2] = {0}; hThread[0] = CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL); hThread[1] = CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL); CloseHandle(hThread[0]); CloseHandle(hThread[1]); Sleep(1000); // 千千万万不要放在return 0;语句的上一行 CloseHandle(g_h1); CloseHandle(g_h2); return 0; }
结果(有可能每次运行的结果都不一样哈):
addToQueque--------->1
addToQueque--------->2
delFromQueue : 1
addToQueque--------->3
delFromQueue : 2
addToQueque--------->4
delFromQueue : 3
addToQueque--------->5
delFromQueue : 4
addToQueque--------->6
delFromQueue : 5
addToQueque--------->7
delFromQueue : 6
addToQueque--------->8
delFromQueue : 7
delFromQueue : 8
addToQueque--------->9
delFromQueue : 9
addToQueque--------->10
delFromQueue : 10
addToQueque--------->11
delFromQueue : 11
addToQueque--------->12
delFromQueue : 12
addToQueque--------->13
delFromQueue : 13
addToQueque--------->14
delFromQueue : 14
addToQueque--------->15
delFromQueue : 15
addToQueque--------->16
delFromQueue : 16
addToQueque--------->17
delFromQueue : 17
addToQueque--------->18
delFromQueue : 18
addToQueque--------->19
delFromQueue : 19
addToQueque--------->20
delFromQueue : 20
addToQueque--------->21
delFromQueue : 21
addToQueque--------->22
delFromQueue : 22
addToQueque--------->23
delFromQueue : 23
addToQueque--------->24
delFromQueue : 24
addToQueque--------->25
delFromQueue : 25
addToQueque--------->26
delFromQueue : 26
addToQueque--------->27
delFromQueue : 27
addToQueque--------->28
delFromQueue : 28
addToQueque--------->29
delFromQueue : 29
addToQueque--------->30
delFromQueue : 30
addToQueque--------->31
delFromQueue : 31
addToQueque--------->32
delFromQueue : 32
addToQueque--------->33
delFromQueue : 33
addToQueque--------->34
delFromQueue : 34
addToQueque--------->35
delFromQueue : 35
addToQueque--------->36
delFromQueue : 36
addToQueque--------->37
delFromQueue : 37
addToQueque--------->38
delFromQueue : 38
addToQueque--------->39
delFromQueue : 39
addToQueque--------->40
delFromQueue : 40
addToQueque--------->41
delFromQueue : 41
addToQueque--------->42
delFromQueue : 42
addToQueque--------->43
delFromQueue : 43
addToQueque--------->44
delFromQueue : 44
addToQueque--------->45
delFromQueue : 45
addToQueque--------->46
delFromQueue : 46
addToQueque--------->47
delFromQueue : 47
addToQueque--------->48
delFromQueue : 48
addToQueque--------->49
delFromQueue : 49
addToQueque--------->50
delFromQueue : 50
addToQueque--------->51
delFromQueue : 51
addToQueque--------->52
delFromQueue : 52
addToQueque--------->53
delFromQueue : 53
addToQueque--------->54
delFromQueue : 54
addToQueque--------->55
delFromQueue : 55
addToQueque--------->56
delFromQueue : 56
addToQueque--------->57
delFromQueue : 57
addToQueque--------->58
delFromQueue : 58
addToQueque--------->59
delFromQueue : 59
addToQueque--------->60
delFromQueue : 60
addToQueque--------->61
delFromQueue : 61
addToQueque--------->62
delFromQueue : 62
addToQueque--------->63
delFromQueue : 63
addToQueque--------->64
delFromQueue : 64
addToQueque--------->65
delFromQueue : 65
addToQueque--------->66
delFromQueue : 66
addToQueque--------->67
delFromQueue : 67
addToQueque--------->68
delFromQueue : 68
addToQueque--------->69
delFromQueue : 69
addToQueque--------->70
delFromQueue : 70
addToQueque--------->71
delFromQueue : 71
addToQueque--------->72
delFromQueue : 72
addToQueque--------->73
delFromQueue : 73
addToQueque--------->74
delFromQueue : 74
addToQueque--------->75
delFromQueue : 75
addToQueque--------->76
delFromQueue : 76
addToQueque--------->77
delFromQueue : 77
addToQueque--------->78
delFromQueue : 78
addToQueque--------->79
delFromQueue : 79
addToQueque--------->80
delFromQueue : 80
addToQueque--------->81
delFromQueue : 81
addToQueque--------->82
delFromQueue : 82
addToQueque--------->83
delFromQueue : 83
addToQueque--------->84
delFromQueue : 84
addToQueque--------->85
delFromQueue : 85
addToQueque--------->86
delFromQueue : 86
addToQueque--------->87
delFromQueue : 87
addToQueque--------->88
delFromQueue : 88
addToQueque--------->89
delFromQueue : 89
addToQueque--------->90
delFromQueue : 90
addToQueque--------->91
delFromQueue : 91
addToQueque--------->92
delFromQueue : 92
addToQueque--------->93
delFromQueue : 93
addToQueque--------->94
delFromQueue : 94
addToQueque--------->95
delFromQueue : 95
addToQueque--------->96
delFromQueue : 96
addToQueque--------->97
delFromQueue : 97
addToQueque--------->98
delFromQueue : 98
addToQueque--------->99
delFromQueue : 99
addToQueque--------->100
delFromQueue : 100