Windows多线程学习随笔
自学Windows多线程知识,例程如下:
1 #include <iostream> 2 #include <windows.h> 3 #include <process.h> 4 using namespace std; 5 HANDLE hMutex = NULL;//互斥量 6 HANDLE mutex = NULL; 7 8 unsigned WINAPI Fun1(PVOID lpParamter) 9 { 10 WaitForSingleObject(mutex, INFINITE); 11 for (int i = 0; i < 3; i++) 12 cout << "A Thread Fun 1 Display!"<<endl; 13 Sleep(200); 14 ReleaseMutex(mutex); 15 return 0L; 16 } 17 18 19 void main() 20 { 21 HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, Fun1, NULL, 0, NULL);//较CreateThread更加安全 22 //HANDLE hThread = CreateThread(NULL, 0, Fun1, NULL, 0, NULL); 23 CloseHandle(hThread); 24 //_endthreadex((unsigned)hThread);//较CloseHandle更加安全 25 mutex = CreateMutex(NULL,false,"Ohye"); 26 27 for (int i = 0; i < 3; i++){ 28 WaitForSingleObject(mutex, INFINITE); 29 cout << "Main Thread Display!" << endl; 30 Sleep(500); 31 ReleaseMutex(mutex); 32 } 33 34 system("pause"); 35 }
运行结果:
_endthreadex与_beginthreadex方法相对应,
1、_endthreadex销毁了在_beginthreadex分配的堆内存(保证了没有内存泄露)。
2、其调用了系统API ExitThread退出线程。
ExitThread VS _endthreadex
在编写C\C++程序时,要调用_endthreadex来结束线程。基于如下两个理由:
1、ExitThread函数非C++函数,线程创建的C++对象不会得到析构。
2、若线程中使用了ptd,ExitThread不会释放内存,造成内存泄露。
CreateThread VS _beginthreadex
一般的理由是,CreateThread有可能照成内存泄露。(如果使用了ptd内存,而CreateThread并不会在内部自动调用释放内存函数,但若链接的是C/C++运行库的dll版本,则其会在线程退出的DLL_THREAD_DETCH通知中释放内存)。