如何确保一个函数的被调用次数不少于另外一个函数的被调用次数?

        这是个有趣的问题,直接上代码:

#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

你可能感兴趣的:(如何确保一个函数的被调用次数不少于另外一个函数的被调用次数?)