C++ 使用unique_lock进行多线程处理编程,一个线程用于数据的获取一个线程用于数据的处理并用list作为数据的容器用代码举例说明
时间: 2024-04-12 07:31:10 浏览: 139
当使用C++中的`std::unique_lock`进行多线程处理时,可以使用一个线程负责数据的获取,另一个线程负责数据的处理,并使用`std::list`作为数据的容器。下面是一个示例代码,展示了如何使用`std::unique_lock`和`std::list`进行多线程处理:
```cpp
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <list>
std::mutex mtx; // 定义互斥量
std::condition_variable cv; // 条件变量
std::list<int> data; // 定义数据容器
void getData() {
for (int i = 0; i < 10; ++i) {
std::unique_lock<std::mutex> lock(mtx); // 创建unique_lock并锁住互斥量
data.push_back(i); // 添加数据到容器
lock.unlock(); // 解锁互斥量
cv.notify_one(); // 通知等待的线程有新数据可用
}
}
void processData() {
while (true) {
std::unique_lock<std::mutex> lock(mtx); // 创建unique_lock并锁住互斥量
cv.wait(lock, []{ return !data.empty(); }); // 等待直到有数据可用
int value = data.front(); // 获取数据
data.pop_front(); // 从容器中移除数据
lock.unlock(); // 解锁互斥量
// 处理数据
std::cout << "Processing data: " << value << std::endl;
}
}
int main() {
std::thread t1(getData);
std::thread t2(processData);
t1.join();
t2.join();
return 0;
}
```
在上述示例中,我们定义了一个全局的`std::mutex`对象`mtx`作为互斥量,一个`std::condition_variable`对象`cv`作为条件变量,以及一个`std::list<int>`对象`data`作为数据容器。
在`getData`函数中,我们使用一个循环来添加数据到容器中。首先,我们创建一个`std::unique_lock<std::mutex>`对象`lock`,并通过构造函数将互斥量`mtx`作为参数传递进去。然后,我们添加数据到容器中,并解锁互斥量。最后,我们通过调用`cv.notify_one()`通知等待的线程有新数据可用。
在`processData`函数中,我们使用一个无限循环来获取和处理数据。首先,我们创建一个`std::unique_lock<std::mutex>`对象`lock`,并通过构造函数将互斥量`mtx`作为参数传递进去。然后,我们调用`cv.wait()`等待直到有数据可用。在等待期间,互斥量会被解锁,允许其他线程访问互斥量。当被通知到有新数据可用时,线程会重新锁住互斥量,并获取数据进行处理。最后,我们解锁互斥量,并对获取到的数据进行处理。
在`main`函数中,我们创建了两个线程`t1`和`t2`,分别用于数据的获取和数据的处理。然后,通过调用`join()`函数等待两个线程结束。
通过使用`std::unique_lock`、互斥量和条件变量,我们可以实现多线程间的同步和数据共享,并且使用`std::list`作为数据容器,可以方便地添加、获取和移除数据。需要注意的是,在实际应用中,还需要考虑更多的同步机制、错误处理和线程安全性。
阅读全文