vector 的锁机制
时间: 2024-05-05 13:14:10 浏览: 232
vector是C++标准库中的一个容器,用于存储和管理一组元素。在多线程环境下,如果多个线程同时对vector进行读写操作,就会存在数据竞争的问题,为了保证线程安全,可以采用锁机制来对vector进行保护。
一种常见的锁机制是使用互斥锁(mutex)。互斥锁是一种同步原语,它可以确保在同一时间只有一个线程可以访问被保护的资源。在对vector进行读写操作之前,线程需要先获取互斥锁,然后执行相应的操作,最后释放互斥锁,以便其他线程可以获取锁并进行操作。
下面是一个简单的示例代码,演示了如何使用互斥锁来保护vector:
```cpp
#include <iostream>
#include <vector>
#include <mutex>
#include <thread>
std::vector<int> myVector;
std::mutex mtx;
void addToVector(int value) {
std::lock_guard<std::mutex> lock(mtx); // 获取互斥锁
myVector.push_back(value); // 对vector进行写操作
}
void printVector() {
std::lock_guard<std::mutex> lock(mtx); // 获取互斥锁
for (const auto& value : myVector) { // 对vector进行读操作
std::cout << value << " ";
}
std::cout << std::endl;
}
int main() {
std::thread t1(addToVector, 1);
std::thread t2(addToVector, 2);
std::thread t3(printVector);
t1.join();
t2.join();
t3.join();
return 0;
}
```
在上述代码中,使用了std::mutex来定义互斥锁mtx。在addToVector函数中,通过std::lock_guard<std::mutex> lock(mtx)获取互斥锁,确保只有一个线程可以执行push_back操作。在printVector函数中,同样使用std::lock_guard<std::mutex> lock(mtx)获取互斥锁,确保只有一个线程可以遍历vector并输出。
阅读全文