请用三种vc的多线程同步方法编写一个多线程的 程 序
时间: 2023-05-08 11:01:32 浏览: 95
在VC中,可以使用三种多线程同步方法,分别是临界区(CriticalSection)、事件(Event)、互斥体(Mutex)。下面是一个使用这三种方法的多线程程序的示例:
#include <windows.h>
#include <iostream>
using namespace std;
int g_iCount = 0;
CRITICAL_SECTION g_cs; //定义临界区
HANDLE g_hEvent; //定义事件句柄
HANDLE g_hMutex; //定义互斥体句柄
DWORD WINAPI ThreadFunc(LPVOID lpParam)
{
for (int i = 0; i < 100000; i++)
{
EnterCriticalSection(&g_cs); //进入临界区
g_iCount++; //临界区内进行操作
LeaveCriticalSection(&g_cs); //退出临界区
SetEvent(g_hEvent); //设置事件
WaitForSingleObject(g_hMutex, INFINITE); //等待互斥体
g_iCount--; //互斥体中进行操作
ReleaseMutex(g_hMutex); //释放互斥体
}
return 0;
}
int main(int argc, char* argv[])
{
HANDLE hThread[2];
DWORD dwThreadId[2];
InitializeCriticalSection(&g_cs); //初始化临界区
g_hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); //创建事件
g_hMutex = CreateMutex(NULL, FALSE, NULL); //创建互斥体
for (int i = 0; i < 2; i++)
{
hThread[i] = CreateThread(NULL, 0, ThreadFunc, NULL, 0, &dwThreadId[i]); //创建线程
}
for (int i = 0; i < 2; i++)
{
WaitForSingleObject(hThread[i], INFINITE); //等待线程结束
}
cout << "iCount = " << g_iCount << endl;
DeleteCriticalSection(&g_cs); //删除临界区
CloseHandle(g_hEvent); //关闭事件句柄
CloseHandle(g_hMutex); //关闭互斥体句柄
return 0;
}
上面的程序中,首先定义了一个全局变量g_iCount,用于计数。然后定义了一个临界区g_cs、一个事件句柄g_hEvent、一个互斥体句柄g_hMutex。在主函数中,首先初始化临界区、创建事件句柄、创建互斥体句柄。然后创建两个线程,每个线程都调用ThreadFunc函数。在ThreadFunc函数中,通过EnterCriticalSection和LeaveCriticalSection进入和退出临界区。通过SetEvent设置事件,并通过WaitForSingleObject等待互斥体。通过ReleaseMutex释放互斥体。最后主函数等待两个线程结束,并输出计数结果。最后删除临界区,关闭事件句柄和互斥体句柄。