每羊杨

https://github.com/Zeppelin5 (Kinfu讨论群:563741937)

导航

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通知中释放内存)。

posted on 2018-11-26 11:36  每羊杨  阅读(185)  评论(0编辑  收藏  举报