用信号量处理多线程数据

简单使用

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

int num = 0;					//全局变量

DWORD WINAPI add(void *p)
{
	HANDLE mySemaphore = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, "xy");       //打开信号量
	if (mySemaphore == NULL)
	{
		printf("打开信号量失败!\n");
		return 0;
	}
	else
	{
		WaitForSingleObject(mySemaphore, INFINITE);                          //等待信号
		for (int i = 0; i < 100000; i++)
		{
			num++;
		}
		ReleaseSemaphore(mySemaphore, 1, NULL);				     //增加信号计数
		CloseHandle(mySemaphore);
		return 1;
	}
}

int main(int argc, char *argv[])
{
	HANDLE mySemaphore = CreateSemaphore(NULL, 0, 1, "xy");			     //创建信号量
	ReleaseSemaphore(mySemaphore, 1, NULL);					     //增加信号计数
	HANDLE hd[8];
	for (int i = 0; i < 8; i++)
	{
		hd[i] = CreateThread(NULL, 0, add, NULL, 0, NULL);		     //创建线程
	}
	WaitForMultipleObjects(8, hd, TRUE, INFINITE);
	printf("num=%d\n", num);

	for (int i = 0; i < 8; i++)
	{
		CloseHandle(hd[i]);						     //关闭线程
	}
	system("pause");
	return 0;
}


秋风 2016-06-28