给我写一个windowsC++多线程程序,使用windowsAPI读写锁,1个线程写,2个线程读
时间: 2024-03-26 22:41:12 浏览: 218
好的,以下是一个使用 Windows API 实现读写锁的示例程序,可以满足您的要求:
```c++
#include <iostream>
#include <Windows.h>
using namespace std;
SRWLOCK srwLock; // 定义读写锁
bool ready = false; // 标志位,表示数据是否准备好
int data = 0; // 共享数据
void writer() {
for (int i = 0; i < 10; i++) {
AcquireSRWLockExclusive(&srwLock); // 获取写锁
data = i; // 写入数据
ready = true; // 标记数据已经准备好
ReleaseSRWLockExclusive(&srwLock); // 释放写锁
Sleep(100); // 等待一段时间
}
}
void reader(int id) {
while (true) {
AcquireSRWLockShared(&srwLock); // 获取读锁
while (!ready) { // 如果数据没准备好,就等待
SleepConditionVariableSRW(&srwLock, &srwLock, INFINITE, CONDITION_VARIABLE_LOCKMODE_SHARED);
}
cout << "Reader " << id << " read data: " << data << endl; // 读取数据
ready = false; // 标记数据已经被读取
ReleaseSRWLockShared(&srwLock); // 释放读锁
Sleep(500); // 等待一段时间
}
}
int main() {
InitializeSRWLock(&srwLock); // 初始化读写锁
HANDLE hWriter = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)writer, NULL, 0, NULL); // 创建写线程
HANDLE hReader1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)reader, (LPVOID)1, 0, NULL); // 创建读线程1
HANDLE hReader2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)reader, (LPVOID)2, 0, NULL); // 创建读线程2
WaitForSingleObject(hWriter, INFINITE); // 等待写线程结束
WaitForSingleObject(hReader1, INFINITE); // 等待读线程1结束
WaitForSingleObject(hReader2, INFINITE); // 等待读线程2结束
CloseHandle(hWriter); // 关闭写线程句柄
CloseHandle(hReader1); // 关闭读线程1句柄
CloseHandle(hReader2); // 关闭读线程2句柄
return 0;
}
```
在这个程序中,我们使用了 Windows API 中的 `SRWLOCK` 结构体来实现读写锁。写线程通过调用 `AcquireSRWLockExclusive` 函数获取写锁,然后写入数据并释放写锁。读线程通过调用 `AcquireSRWLockShared` 函数获取读锁,然后检查标志位是否为 true,如果为 false,就调用 `SleepConditionVariableSRW` 函数等待通知。读取完数据后,再将标志位设置为 false 并释放读锁。
注意,使用 Windows API 实现读写锁需要注意一些细节,例如写锁的优先级高于读锁,读写锁的使用方式等等。具体可以参考 MSDN 上的相关文档。
阅读全文