C++ 使用unique_lock进行多线程数据的获取与数据的处理并用list作为数据的容器问题处理举例说明
时间: 2023-12-02 13:05:25 浏览: 67
C++11多线程加锁方式.doc
在C++中,可以使用`std::unique_lock`进行多线程数据的获取和处理,并使用`std::list`作为数据的容器。下面是一个示例代码,说明如何使用`std::unique_lock`和`std::list`来处理多线程数据的获取和处理问题:
```cpp
#include <iostream>
#include <thread>
#include <mutex>
#include <list>
std::mutex mtx; // 定义互斥量
std::list<int> data; // 定义数据容器
void processData() {
while (true) {
std::unique_lock<std::mutex> lock(mtx); // 创建unique_lock并锁住互斥量
if (!data.empty()) {
int value = data.front(); // 获取数据
data.pop_front(); // 从容器中移除数据
lock.unlock(); // 解锁互斥量
// 处理数据
std::cout << "Processing data: " << value << std::endl;
} else {
lock.unlock(); // 解锁互斥量
break; // 容器中没有数据,退出循环
}
}
}
int main() {
// 向容器中添加数据
for (int i = 0; i < 10; ++i) {
std::unique_lock<std::mutex> lock(mtx); // 创建unique_lock并锁住互斥量
data.push_back(i); // 添加数据到容器
lock.unlock(); // 解锁互斥量
}
// 创建多个线程来处理数据
std::thread t1(processData);
std::thread t2(processData);
t1.join();
t2.join();
return 0;
}
```
在上述示例中,我们定义了一个全局的`std::mutex`对象`mtx`作为互斥量,以及一个`std::list<int>`对象`data`作为数据容器。
在`processData`函数中,我们使用一个无限循环来获取和处理数据。首先,我们创建一个`std::unique_lock<std::mutex>`对象`lock`,并通过构造函数将互斥量`mtx`作为参数传递进去。然后,我们检查容器中是否有数据,如果有,就获取容器中的第一个元素,并从容器中移除该元素。然后,我们解锁互斥量,并对获取到的数据进行处理。
在`main`函数中,我们向容器中添加了一些数据,并创建了两个线程`t1`和`t2`来处理数据。每个线程都会调用`processData`函数来获取和处理数据。
通过使用`std::unique_lock`和互斥量来保护数据访问,我们可以确保多个线程之间对数据的安全访问和处理。同时,使用`std::list`作为数据的容器,可以方便地添加、获取和移除数据。
需要注意的是,在生产环境中,还需要考虑更多的同步机制和错误处理,以确保线程安全性和可靠性。
阅读全文