#include <thread>
#include <mutex>
#include <future>
// 定义一个函数,用于线程加载数据
void load_thread(int num, std::mutex& mtx, std::map<int, string>& res)
{
// 将整数转换为字符串,并添加下划线v
std::string value = std::to_string(num).append("_v");
// 输出当前线程的编号和正在加载的数据
std::cout << "Thread " << num << " is loading " << value << std::endl;
// 锁住res
std::unique_lock<std::mutex> lock(mtx);
// 将数据添加到res中
res[num] = value;
// 解锁
lock.unlock();
}
int main()
{
// 定义一个map,用于存储结果
std::map<int, string> result;
// 定义一个vector,用于存储异步任务
std::vector<std::future<void>> futures;
// 锁住result
std::mutex mtx;
// 循环10次
for (int i = 0; i < 10; i++)
{
// 异步
// std::async 函数用于创建一个异步任务。
// std::launch::async 是一个属性,表示异步任务应该在后台线程中运行。
// load_thread 要运行的函数,五个参数:整数 num,std::mutex& mtx,std::map<int, string>& res。
// std::ref(mtx) 和 std::ref(result) 分别表示对 mtx 和 result 的引用,这样在 load_thread 函数中可以直接修改这些变量的值,而无需使用指针。
futures.emplace_back(std::async(std::launch::async, load_thread, i, std::ref(mtx), std::ref(result)));
}
// 等待每个线程读取完
for (auto& future : futures)
{
future.wait();
}
for(const auto&[key, value] : result)
{
std::cout << key << " " << value << std::endl;
}
return 0;
}
c++异步std::future,多线程
于 2024-01-22 15:36:43 首次发布
本文介绍了一个C++程序,展示了如何使用线程、互斥量(mutex)和future来并发地加载数据到映射中,确保数据同步。main函数中创建了10个异步任务,每个任务调用load_thread函数并将结果存储在共享map中。
摘要由CSDN通过智能技术生成