//利用信号量的这一特点,也可以让信号量只有1 ,则就实现了资源共享冲突的解决。
#include<stdio.h> #include<stdlib.h> #include<Windows.h> //信号量一开始是 0 //这儿可以这样理解,像资源池一样。如果资源池开辟了5个,每个使用要使用时 //就拿去一个,这时资源池就减少一个。如果资源池里的资源为 0 则没有资源可以 //使用,而当使用者 使用完后归还给资源池,这时资源池的资源就会加 1。 //信号量:多个线程运行,其它等待。 //利用信号量的这一特点,也可以让信号量只有1 ,则就实现了资源共享冲突的解决。 #define id "lg" //信号名 #define MAX 3 //可用的最大信号 DWORD WINAPI demo(void *p) { int *pint = p; //printf("%d\n", *pint); //在线程里处理信号 //第一个:全部信号、第二个:一个信号与多个信号的判断、信号的名子 //打开一个信号,判断存不存在。 HANDLE myhsem = OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,id); //打开一个信号 if (myhsem)//如果找到信号 { printf("myworker %d is waitting\n", *pint); //等待信号,如果信号等于 0 时就一直在等待,直到有信号资源可用 //不为 0 时,信号减 1(一开始设置信号的最大量为 MAX,每进一个信号减 1,直到信号为 0 时没有信号资源可用。) if (WaitForSingleObject(myhsem, INFINITE) == WAIT_OBJECT_0) { printf("myworker %d is entering\n", *pint); Sleep(3000); printf("myworker %d is leaving\n", *pint); ReleaseSemaphore(myhsem, 1,NULL); //释放信号,信号加 1 //释放资源 CloseHandle(myhsem); } } } void main() { //创建一个信号对象,开辟一个信号,最大信号量是 MAX //一开始的信号资源是 0 如果不是,则一开始就执行了。 HANDLE hsem = CreateSemaphore(NULL, MAX, MAX, id); int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; HANDLE hd[10] = { 0 }; for (int i = 0; i < 10; i++) { hd[i] = CreateThread(NULL, 0, demo, a + i, 0, NULL); } Sleep(5000); printf("5秒钟后激活线程......\n"); //激活线程,如果CreateSemaphore(NULL, 0, MAX, id);这时就需要使用下面的激活,如果这儿设置的不是 0 就不需要激活 //ReleaseSemaphore(hsem, MAX, NULL);//一次最多进入MAX个 WaitForMultipleObjects(10, hd, TRUE, INFINITE); CloseHandle(hsem); //关闭信号 system("pause"); }