完成两个子线程的互斥。在主系统中使用系统调用函数CreateThread()创建两个子线程,并使两个子线程互斥地使用全局变量count
时间: 2024-10-16 20:20:56 浏览: 42
C#多线程互斥,两个线程交替工作
在Windows平台上,为了实现两个子线程之间的互斥访问全局变量`count`,可以使用Windows API提供的`CreateMutex()`函数来创建一个互斥量(Mutex),这是一种同步机制,用于保护共享资源不受并发访问的影响。以下是基本步骤:
1. **创建互斥量**:
使用`CreateMutex(NULL, FALSE, "MyMutex")`创建一个名为"MyMutex"的互斥量,第一个参数为NULL表示默认权限,第二个参数FALSE表示如果该互斥量已经存在则不会自动打开。
```cpp
HANDLE mutex = CreateMutex(NULL, FALSE, TEXT("MyMutex"));
if (mutex == NULL)
{
// 错误处理:无法创建互斥量
}
```
2. **线程启动函数**:
对于每个子线程,你需要在进入临界区之前尝试获取这个互斥量。若获取成功,则说明当前线程获得了锁,可以安全地修改`count`;否则,线程需要等待直到其他线程释放互斥量。
```cpp
DWORD WINAPI ThreadFunction(LPVOID lpParam)
{
// 等待获取互斥量
if (!WaitForSingleObject(mutex, INFINITE))
{
printf("Failed to acquire mutex.\n");
return 0;
}
// 更新全局变量count
int countValue = InterlockedIncrement((LONG*)&count); // 使用原子操作避免数据竞争
// ... 访问count并完成任务 ...
// 释放互斥量
ReleaseMutex(mutex);
// ... 其他清理工作 ...
return 0;
}
// 创建并启动线程
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
if (!CreateThread(&si, 0, ThreadFunction, NULL, 0, &pi))
{
// 错误处理:创建线程失败
}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
```
阅读全文