这是个有趣的问题,直接上代码:
#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