给我写一个windowsC++多线程程序,使用读写锁,1个线程写,2个线程读
时间: 2024-03-26 16:41:09 浏览: 66
好的,以下是一个简单的示例程序,可以满足您的要求:
```c++
#include <iostream>
#include <cstdlib>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <chrono>
using namespace std;
mutex mtx; // 互斥锁
condition_variable cv; // 条件变量
bool ready = false; // 标志位,表示数据是否准备好
int data = 0; // 共享数据
void writer() {
for (int i = 0; i < 10; i++) {
unique_lock<mutex> lck(mtx);
data = i; // 写入数据
ready = true; // 标记数据已经准备好
cv.notify_all(); // 通知所有等待的读线程
lck.unlock(); // 解锁互斥锁
this_thread::sleep_for(chrono::milliseconds(100)); // 等待一段时间
}
}
void reader(int id) {
while (true) {
unique_lock<mutex> lck(mtx);
while (!ready) { // 如果数据没准备好,就等待通知
cv.wait(lck);
}
cout << "Reader " << id << " read data: " << data << endl; // 读取数据
ready = false; // 标记数据已经被读取
lck.unlock(); // 解锁互斥锁
this_thread::sleep_for(chrono::milliseconds(500)); // 等待一段时间
}
}
int main() {
thread t1(writer); // 创建写线程
thread t2(reader, 1); // 创建读线程1
thread t3(reader, 2); // 创建读线程2
t1.join(); // 等待写线程结束
t2.join(); // 等待读线程1结束
t3.join(); // 等待读线程2结束
return 0;
}
```
在这个程序中,我们使用了一个互斥锁和一个条件变量来实现读写锁的功能。写线程每次写入数据后,都会将标志位设置为 true,并通知所有等待的读线程。读线程每次读取数据前,都会检查标志位是否为 true,如果为 false,就等待通知。这样,就能保证写操作和读操作之间的互斥性。
注意,这个程序只是一个简单的示例,实际的读写锁需要更复杂的实现。在实际的应用中,您可能需要考虑更多的情况,例如读写并发性、读写优先级等等。
阅读全文