本文将深入探讨使用CreateThread函数创建的程序在多线程与单线程模式下的性能差异、资源消耗及编程复杂度等方面的对比分析。
模拟多线程效果主要有两种方式:第一种是使用定时器;第二种则是启动多个实际的线程,并且在不同的模式下需要调用不同类型的函数,在MFC、API与WIN32环境下需要注意的地方也会有所不同。
VC中创建新线程有三种方法。这里将介绍其中一种,即通过`AfxBeginThread()`来实现多线程功能。该函数用于启动一个新的工作线程,并执行特定的任务。其原型如下:
```cpp
CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc, LPVOID lParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0, DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
```
函数返回值:如果创建成功,将返回新线程的指针;否则为NULL。
- `pfnThreadProc` : 线程入口点函数,其声明必须如下所示:
```cpp
UINT MyThreadFunction(LPVOID pParam)
```
其中不能设置为 NULL。
- `lParam` : 传递给线程的数据参数。注意它的类型是 LPVOID, 因此可以传递任何类型的指针,比如结构体。
- `nPriority`: 指定新创建的线程优先级,默认值0表示它与主程序具有相同的优先级。
- `nStackSize` : 新创建线程栈大小设置。如果为 0,则使用和主线程一样大小的堆栈空间。
- `dwCreateFlags` : 创建完成后,指定是否立即运行该新线程或暂时挂起(CREATE_SUSPENDED)。
- `lpSecurityAttrs`: 安全性属性指针;若为NULL则与主程序相同。
在使用 AfxBeginThread 的时候需要注意的是:工作者线程的函数必须是全局或者静态成员函数,不能直接用普通的类内成员方法。
此外还有一种方式是通过`CreateThread()`来创建新线程:
```cpp
HANDLE CreateThread( NULL, 0 , MyThreadProc, (LPVOID)&n,NULL,NULL);
```
这里返回的是一个句柄;如果不需要再监视线程,则可以使用 `CloseHandle()` 来关闭这个句柄。值得注意的是,`CreateThread` 创建的线程函数必须定义为:
```cpp
DWORD WINAPI MyThreadProc(LPVOID pParameter)
```
最后还有一种方法是通过 _beginthread() 函数来创建新线程:
```c++
intptr_t _beginthread(void( *start_address )( void * ), unsigned stack_size, void *arglist );
```
返回值:如果成功,函数将返回一个指向新线程的句柄;否则返回 -1。对于_beginthread 创建的线程,其线程函数定义为:
```cpp
void ThreadPro(void * pArguments )
```
总结来说,在VC中创建多线程时可以使用 `AfxBeginThread()`、`CreateThread()` 或者 `_beginthread()` 函数来实现,并且每种方法都有自己的适用场景和特点。