完成两个子线程互斥,在主线程中使用系统调用 CreateThread()创建两个子线程,在子 线程中互斥地使用全局变量 count,改变其值并输出。 提示:使用初始化临界区创建,在子线程中使用 count 之前、后分别使用进入临界区和退出 临界区,运行完毕后删除临界区。主线程创建子线程以后,主线程阻塞,让子线程先执行;子线程执行完毕以后唤醒主线 程,以此完成了主、子两个线程的同步。
时间: 2024-02-11 22:07:22 浏览: 161
好的,这是一个典型的线程同步问题,可以使用临界区来实现两个子线程对共享变量的互斥访问。以下是代码实现:
```c++
#include <windows.h>
#include <iostream>
using namespace std;
// 全局变量
CRITICAL_SECTION cs;
int count = 0;
// 子线程函数
DWORD WINAPI threadFunc(LPVOID lpParam) {
EnterCriticalSection(&cs); // 进入临界区
count++;
cout << "Current count: " << count << endl;
LeaveCriticalSection(&cs); // 退出临界区
return 0;
}
int main() {
// 初始化临界区
InitializeCriticalSection(&cs);
// 创建两个子线程
HANDLE hThread1 = CreateThread(NULL, 0, threadFunc, NULL, 0, NULL);
HANDLE hThread2 = CreateThread(NULL, 0, threadFunc, NULL, 0, NULL);
// 等待子线程执行完毕
WaitForSingleObject(hThread1, INFINITE);
WaitForSingleObject(hThread2, INFINITE);
// 删除临界区
DeleteCriticalSection(&cs);
return 0;
}
```
在子线程函数中,先使用 `EnterCriticalSection()` 进入临界区,以确保代码块中的操作是互斥的;然后修改共享变量 `count`,并输出其值;最后使用 `LeaveCriticalSection()` 退出临界区。
在主线程中,先使用 `InitializeCriticalSection()` 初始化临界区;然后使用 `CreateThread()` 创建两个子线程,让它们执行 `threadFunc()` 函数;接着使用 `WaitForSingleObject()` 等待子线程执行完毕,以保证主子线程同步;最后使用 `DeleteCriticalSection()` 删除临界区。
这样就实现了两个子线程的互斥访问共享变量 `count`,保证了线程安全。
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![-](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![-](https://img-home.csdnimg.cn/images/20241231044901.png)
![-](https://img-home.csdnimg.cn/images/20241231044901.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)