进程与线程(六)用内核对象进行线程同步(下)
来源:互联网 发布:漫画控网络错误 编辑:程序博客网 时间:2024/06/04 19:44
信号量,资源计数为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 }....
- 进程与线程(六)用内核对象进行线程同步(下)
- 进程与线程(五)用内核对象进行线程同步(上)
- Windows核心编程:(六)用内核对象进行线程同步
- 线程同步-用内核对象进程线程同步
- 用内核对象进行线程同步1
- windows 用内核对象进行线程同步
- 用内核对象进行线程同步
- 用内核对象进行线程同步
- 用内核对象同步线程
- Windows核心编程:用内核对象进行线程同步
- 第九章:用内核对象进行线程同步
- 第九章:用内核对象进行线程同步(一)
- 第九章:用内核对象进行线程同步(二) .
- Windows核心编程 用内核对象进行线程同步
- windows核心编程-9.用内核对象进行线程同步
- windows核心编程-用内核对象进行线程同步
- windows核心编程---用内核对象进行线程同步
- 线程与内核对象的同步
- Facebook生态效应:养活了一大批创业公司
- IOCP编程小结(上)
- 错误.@Override------ View.OnClickListener(){} must override a superclass method
- EXT JS4类体系
- NFS配置
- 进程与线程(六)用内核对象进行线程同步(下)
- Windows内核
- 腾讯后台开发技术总监浅谈过载保护 小心雪球效应
- GUI_DOWNLOAD如何带表头及输出前导0
- EntityFramework 4.3.1 CodeFirst with MySQL (.net connector version<6.5.4)
- 进程与线程(七)APC的实验,古老的Code
- select模型
- 织梦链怎么去掉?如何去掉织梦链?dedecms模板友链中织梦链去掉的方法
- 3.1 面向过程与面向对象