完成两个子线程互斥,在主线程中使用系统调用 CreateThread()创建两个子线程,在子线程中互斥地使用全局变量 count,改变其值并输出。提示:使用初始化临界区创建,在子线程中使用 count 之前、后分别使用进入临界区和退出临界区,运行完毕后删除临界区。c++实现
时间: 2024-02-11 21:04:14 浏览: 91
C++ 创建线程互斥对象
5星 · 资源好评率100%
好的,以下是代码实现:
```c++
#include <iostream>
#include <windows.h>
using namespace std;
// 全局变量
int count = 0;
// 临界区对象
CRITICAL_SECTION cs;
// 子线程1
DWORD WINAPI Thread1(LPVOID lpParameter)
{
for (int i = 0; i < 10; i++)
{
// 进入临界区
EnterCriticalSection(&cs);
// 修改全局变量
count++;
cout << "Thread1: count = " << count << endl;
// 退出临界区
LeaveCriticalSection(&cs);
// 等待一段时间
Sleep(1000);
}
return 0;
}
// 子线程2
DWORD WINAPI Thread2(LPVOID lpParameter)
{
for (int i = 0; i < 10; i++)
{
// 进入临界区
EnterCriticalSection(&cs);
// 修改全局变量
count--;
cout << "Thread2: count = " << count << endl;
// 退出临界区
LeaveCriticalSection(&cs);
// 等待一段时间
Sleep(1000);
}
return 0;
}
int main()
{
// 初始化临界区
InitializeCriticalSection(&cs);
// 创建子线程1
HANDLE hThread1 = CreateThread(NULL, 0, Thread1, NULL, 0, NULL);
if (hThread1 == NULL)
{
cerr << "Error: create Thread1 failed." << endl;
return -1;
}
// 创建子线程2
HANDLE hThread2 = CreateThread(NULL, 0, Thread2, NULL, 0, NULL);
if (hThread2 == NULL)
{
cerr << "Error: create Thread2 failed." << endl;
return -1;
}
// 等待子线程结束
WaitForSingleObject(hThread1, INFINITE);
WaitForSingleObject(hThread2, INFINITE);
// 删除临界区
DeleteCriticalSection(&cs);
return 0;
}
```
上面的代码中,我们使用了 Windows API 中的 `CreateThread()` 函数创建了两个子线程,分别执行 `Thread1()` 和 `Thread2()` 函数。我们使用了 `CRITICAL_SECTION` 类型的对象 `cs` 来表示临界区,并使用 `InitializeCriticalSection()` 函数进行了初始化。在子线程中,我们使用了 `EnterCriticalSection()` 和 `LeaveCriticalSection()` 函数来进入和退出临界区,以保证在修改全局变量 `count` 时是互斥的。最后,我们使用 `DeleteCriticalSection()` 函数删除了临界区对象。
阅读全文