我们接着上一篇文章的内容,继续深入解析。
其实,针对多线程访问同一资源时可能会导致程序异常现象是比较难重复制。当系统长时间运行时,一般才会出现这样的情况。一般来说,对多线程程序,如果这些线程需要访问共享资源,就需要进行线程间的同步处理。
利用互斥对象实现线程同步:
互斥对象(mutex)属于内核对象,它能够确保线程拥有对单个资源的互斥访问权。其包含一个使用数量,一个线程ID和一个计算器。其中ID用于标识系统中的哪个线程当前拥有互斥对象,计算器用于指明该线程拥有互斥对象的次数。创建函数(CreateMutex)----创建或打开一个命名的或匿名的互斥对象,然后重新就可以利用互斥对象完成线程间的同步。
当线程对共享资源访问结束后,释放该对象的所有权,让该对象处于已通知状态。函数(ReleaseMutex)---- 释放指定对象的所有权。
此外,线程必须主动请求共享对象的使用权才有可能获得该所有权,调用函数:(WaitForSingleObject).该函数只有在以下两种情况下才会返回:
- 指定的对象变成有信号状态;
- 指定的等待时间间隔已过。
针对此问题,我们将代码完善如下:
1 #include<windows.h> 2 #include<iostream.h> 3 4 DWORD WINAPI Fun1Proc(LPVOID lpParameter); 5 DWORD WINAPI Fun2Proc(LPVOID lpParameter); 6 int index=0; 7 int tick=100; 8 HANDLE hMutex; 9 void main() 10 { 11 HANDLE hThread1; 12 HANDLE hThread2; 13 hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); 14 hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL); 15 CloseHandle(hThread1); 16 CloseHandle(hThread2); 17 //Create mutex object. 18 hMutex=CreateMutex(NULL,FALSE,NULL); 19 Sleep(4000); 20 } 21 //thread function 22 DWORD WINAPI Fun1Proc(LPVOID lpParameter) 23 { 24 /*while(index++<100) 25 cout<<"Thread1 is running."<<endl;*/ 26 while(true) 27 { 28 //request object using 29 WaitForSingleObject(hMutex,INFINITE); 30 if(tick>0) 31 { 32 cout<<"Thread1 sell tick:"<<tick--<<endl; 33 } 34 else break; 35 ReleaseMutex(hMutex); 36 } 37 return 0; 38 } 39 //thread function 40 DWORD WINAPI Fun2Proc(LPVOID lpParameter) 41 { 42 while(true) 43 { 44 //request object using 45 WaitForSingleObject(hMutex,INFINITE); 46 if(tick>0) 47 { 48 cout<<"Thread2 sell tick:"<<tick--<<endl; 49 } 50 else break; 51 ReleaseMutex(hMutex); 52 } 53 return 0; 54 }
编译运行:
End.
谢谢.