```C++
unsigned int __stdcall ThreadFunc(LPVOID lpParam);
```
- unsigned int:返回值类型,通常使用unsigned int或者void
- __stdcall:指定函数调用约定,需要和beginthreadex函数的调用约定一致
- ThreadFunc:函数名称,可以任意指定
- LPVOID lpParam:指向线程函数参数的指针,通常使用LPVOID类型
下面是一个简单的线程函数示例:
```C++
unsigned int __stdcall ThreadFunc(LPVOID lpParam)
while (true)
Sleep(1000); // 等待1秒
printf("This is a new thread.\n");
return 0;
```
线程函数中采用了一个循环结构,每隔1秒输出一句话。
3. 使用beginthreadex函数创建线程
在编写好线程函数之后,我们就可以使用beginthreadex函数创建线程了。
下面是一个示例:
```C++
#include < Windows.h >
#include
unsigned int __stdcall ThreadFunc(LPVOID lpParam);
int main()
HANDLE hThread;
DWORD dwThreadId;
hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadFunc, NULL, 0, &dwThreadId);
if (hThread == NULL)
printf("Failed to create a new thread.\n");
return -1;
// 等待5秒钟,然后终止线程。
Sleep(5000);
TerminateThread(hThread, 0);
CloseHandle(hThread);
printf("The new thread is terminated.\n");
return 0;
unsigned int __stdcall ThreadFunc(LPVOID lpParam)
while (true)
Sleep(1000); // 等待1秒
printf("This is a new thread.\n");
return 0;
```
在上述代码中,我们首先调用了beginthreadex函数,创建了一个新的线程。该函数返回值为线程的句柄,我们可以使用该句柄进行线程控制。
然后,我们调用了Sleep函数,等待5秒钟。在这段等待时间中,新线程会不断输出一句话。
最后,我们调用了TerminateThread函数,强制终止新线程,并释放线程资源。
4. 创建多个线程
在上述示例中,我们只创建了一个新线程。但是在实际的应用中,我们可能需要同时创建多个线程,来处理不同的任务。
下面是一个创建多个线程的示例:
```C++
#include < Windows.h >
#include
unsigned int __stdcall ThreadFunc(LPVOID lpParam);
int main()
const int ThreadCount = 5;
HANDLE hThreads[ThreadCount];
DWORD dwThreadIds[ThreadCount];
for (int i = 0; i < ThreadCount; i++)
hThreads[i] = (HANDLE)_beginthreadex(NULL, 0, ThreadFunc, (void*)i, 0, &dwThreadIds[i]);
if (hThreads[i] == NULL)
printf("Failed to create a new thread.\n");
return -1;
// 等待5秒钟,然后终止所有线程。
Sleep(5000);
for (int i = 0; i < ThreadCount; i++)
TerminateThread(hThreads[i], 0);
CloseHandle(hThreads[i]);
printf("All threads are terminated.\n");
return 0;
unsigned int __stdcall ThreadFunc(LPVOID lpParam)
int nThreadId = (int)lpParam;
while (true)
Sleep(1000); // 等待1秒
printf("This is thread %d.\n", nThreadId);
return 0;
```
在这个示例中,我们使用循环结构创建了5个线程,每个线程的线程函数中会输出自己的线程ID。在main函数中,我们等待5秒钟,终止所有线程。
5. 线程同步
在多线程应用程序中,一个常见的问题是线程同步。线程同步是指多个线程之间的协作操作,保证线程之间的安全访问和资源分配。
在Windows操作系统中,我们可以通过互斥锁和信号量来实现线程同步。
互斥锁是一种保护共享资源的机制,使用互斥锁可以在多个线程之间创建一个临界区,保证每次只有一个线程可以访问该共享资源。操作系统提供了两种互斥锁:临界区和互斥体。
信号量是一种控制并发的机制,使用信号量可以控制线程之间的执行顺序,避免死锁等问题。操作系统提供了两种信号量:自旋锁和事件。
下面我们来看一下如何在多线程应用程序中使用互斥锁。
```C++
#include < Windows.h >
#include
unsigned int __stdcall ThreadFunc(LPVOID lpParam);
HANDLE g_hMutex; // 互斥锁句柄
int main()
const int ThreadCount = 5;
HANDLE hThreads[ThreadCount];
DWORD dwThreadIds[ThreadCount];
// 创建互斥锁
g_hMutex = CreateMutex(NULL, FALSE, NULL);
if (g_hMutex == NULL)
printf("Failed to create a mutex.\n");
return -1;
// 创建多个线程
for (int i = 0; i < ThreadCount; i++)
hThreads[i] = (HANDLE)_beginthreadex(NULL, 0, ThreadFunc, (void*)i, 0, &dwThreadIds[i]);
if (hThreads[i] == NULL)
printf("Failed to create a new thread.\n");
return -1;
// 等待5秒钟,然后终止所有线程。
Sleep(5000);
for (int i = 0; i < ThreadCount; i++)
TerminateThread(hThreads[i], 0);
CloseHandle(hThreads[i]);
printf("All threads are terminated.\n");
// 关闭互斥锁
CloseHandle(g_hMutex);
return 0;
unsigned int __stdcall ThreadFunc(LPVOID lpParam)
int nThreadId = (int)lpParam;
while (true)
// 使用互斥锁进行同步
WaitForSingleObject(g_hMutex, INFINITE);
Sleep(1000); // 等待1秒
printf("This is thread %d.\n", nThreadId);
ReleaseMutex(g_hMutex);
return 0;
```
在上述代码中,我们使用了CreateMutex函数创建了一个互斥锁,然后在线程函数中使用了WaitForSingleObject和ReleaseMutex函数来控制线程执行顺序。
WaitForSingleObject函数会阻塞线程,直到互斥锁变得可用。如果互斥锁处于已被占用状态,则WaitForSingleObject函数会一直等待,直到互斥锁变得可用。
ReleaseMutex函数释放该互斥锁,并允许其他等待此锁的线程访问共享资源。
6. 总结
本文中,我们介绍了如何使用beginthreadex函数创建多线程应用程序。我们学习了线程函数的编写方法,以及如何使用循环结构和参数传递实现多个线程的同时执行。同时,我们还介绍了线程同步的方法,包括互斥锁和信号量。通过本文的学习,读者能够更好地理解和应用多线程编程技术,提高应用程序的性能和响应能力。