信号量,资源计数为0时未触发,计数大于0时触发,现在看这个例子可能不会觉得有什么用,等到多线程这块结束时拿出一个我高二时写的多线程的例子~就会看出其用处了~暂且无聊一下~
1 int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
2 {
3 _tsetlocale(LC_ALL,_T("chs") );
4 system("title ReturnsMe的win32api测试程序");
5
6 //创建一个信号量,初始资源计数为0,最大资源计数为5
7 HANDLE hSemaphore = CreateSemaphore(NULL,0,5,NULL);
8
9 wprintf(_T("create a Semaphore \n"));
10
11 HANDLE h[10];
12 //本来我是想把信号量内核对象弄成全局变量的,不知怎么到线程里全局变量就变成0了,日,只好改成线程参数进去了
13 for (int i=0;i<10;i++)
14 {
15 h[i] = chBEGINTHREADEX(NULL,NULL,SetThread,(PVOID)&hSemaphore,0,NULL);
16 }
17
18 WaitForMultipleObjects(10,h,TRUE,INFINITE);
19 system("pause");
20 return 0;
21 }
22
23 DWORD WINAPI SetThread(PHANDLE &hSemaphore)
24 {
25 wprintf(_T("Semaphore will be released within 2s \n"));
26 Sleep(2000);
27 //资源计数加1
28 if (ReleaseSemaphore(hSemaphore,1,NULL) == FALSE)
29 {
30 //wprintf(_T("error code :%d \n"),GetLastError());
31 return 0;
32 }
33 wprintf(_T("called \n"));
34
35 return 0;
36 }
37
38
上面这个代码虽然开了10线程,但只有5个会打印出called。
互斥,应用有很多,不一定只是线程同步,互斥可以保证一个线程访问资源,跟关键段类似,不过这个是内核对象。
1 int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
2 {
3 _tsetlocale(LC_ALL,_T("chs") );
4 system("title ReturnsMe的win32api测试程序");
5
6 HANDLE h[10];
7 //创建一个互斥,通常情况下有名字,因为open得时候会用到
8 HANDLE hMutex = CreateMutex(NULL,TRUE,_T("super7dd"));
9 for (int i=0;i<10;i++)
10 {
11 h[i] = chBEGINTHREADEX(NULL,NULL,SetThread,NULL,0,NULL);
12 }
13 Sleep(2000);
14 ReleaseMutex(hMutex);
15
16 WaitForMultipleObjects(10,h,TRUE,INFINITE);
17 system("pause");
18 return 0;
19 }
20
21 DWORD WINAPI SetThread()
22 {
23
24 HANDLE hMutex;
25 //打开一个互斥,不请求占有。
26 hMutex = OpenMutex(MUTEX_ALL_ACCESS ,FALSE,_T("super7dd"));
27 if (hMutex == NULL)
28 {
29 wprintf(_T("Mutex:super7dd cannot be opened %d\n"),GetLastError());
30 return 0;
31 }
32 //等待互斥触发
33 WaitForSingleObject(hMutex,INFINITE);
34 //再次打开,占有
35 OpenMutex(NULL,TRUE,_T("super7dd"));
36 wprintf(_T("am the thread \n"));
37 Sleep(1000);
38 //释放这个互斥
39 ReleaseMutex(hMutex);
40 return 0;
41 }....