stl编程怎么实现互锁

时间:2025-03-01 11:46:36 明星趣事

在C++中,使用STL实现互锁通常涉及到使用`std::mutex`和`std::condition_variable`来管理对共享资源的访问。下面是一个简单的示例,展示了如何使用这些工具来实现读写锁(read-write lock),这是一种允许多个线程同时读取共享资源,但只允许一个线程写入的机制。

```cpp

include

include

include

include

class ReadWriteLock {

public:

ReadWriteLock() : readerCount(0), writerUsed(false) {}

void lockReader() {

std::unique_lock lock(m);

cv.wait(lock, [this] { return !writerUsed; });

readerCount++;

}

void unlockReader() {

std::unique_lock lock(m);

readerCount--;

if (readerCount == 0) {

cv.notify_all();

}

}

void lockWriter() {

std::unique_lock lock(m);

cv.wait(lock, [this] { return readerCount == 0 && !writerUsed; });

writerUsed = true;

}

void unlockWriter() {

std::unique_lock lock(m);

writerUsed = false;

cv.notify_all();

}

private:

std::mutex m;

std::condition_variable cv;

int readerCount;

bool writerUsed;

};

// 示例使用

ReadWriteLock rwLock;

int sharedData = 0;

void readData() {

rwLock.lockReader();

std::cout << "Reading data: " << sharedData << std::endl;

rwLock.unlockReader();

}

void writeData(int value) {

rwLock.lockWriter();

sharedData = value;

std::cout << "Writing data: " << sharedData << std::endl;

rwLock.unlockWriter();

}

int main() {

std::thread threads;

// 创建多个读线程

for (int i = 0; i < 5; ++i) {

threads[i] = std::thread(readData);

}

// 创建一个写线程

threads = std::thread(writeData, 42);

// 等待所有线程结束

for (auto& t : threads) {

t.join();

}

return 0;

}

```

解释

ReadWriteLock类:

`m`: 用于保护共享数据的互斥锁。

`cv`: 条件变量,用于线程间的同步。

`readerCount`: 记录当前持有读锁的线程数。

`writerUsed`: 标记是否有线程正在持有写锁。

lockReader():

获取读锁前,检查是否有写锁,如果没有则等待。

获取读锁后,增加`readerCount`。

unlockReader():

释放读锁前,减少`readerCount`。

如果`readerCount`变为0,表示没有读锁持有,通知所有等待的线程。

lockWriter():

获取写锁前,检查是否有读锁或写锁,如果没有则等待。

获取写锁后,设置`writerUsed`为`true`。

unlockWriter():

释放写锁前,设置`writerUsed`为`false`。

通知所有等待的线程。

注意事项

这个示例没有处理所有可能的并发情况,例如写锁被持有时,其他写锁或读锁的获取和释放。实际应用中可能需要更复杂的逻辑来确保正确性和性能。

使用条件变量时,要确保在检查条件和等待条件变量之间没有发生竞态条件。

这个示例展示了如何使用STL的基本工具来实现一个简单的读写锁。在实际应用中,可能需要根据具体需求进行调整和优化。