在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 cv.wait(lock, [this] { return !writerUsed; }); readerCount++; } void unlockReader() { std::unique_lock readerCount--; if (readerCount == 0) { cv.notify_all(); } } void lockWriter() { std::unique_lock cv.wait(lock, [this] { return readerCount == 0 && !writerUsed; }); writerUsed = true; } void unlockWriter() { std::unique_lock 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的基本工具来实现一个简单的读写锁。在实际应用中,可能需要根据具体需求进行调整和优化。