C++11单/多线程总结(三十五)

2024-05-07 23:18
文章标签 c++ 总结 多线程 三十五

本文主要是介绍C++11单/多线程总结(三十五),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.代码示例  

#include <iostream>
#include <thread>
#include <mutex>
#include <future>
#include <condition_variable>
#include <queue>
#include <chrono>//1.thread usage demo
#if 0
void foo(){std::cout << "hello" << std::endl;
}int main(){std::thread t(foo);t.join();return 0;
}#endif//2.mutex usage demo
#if 0
std::mutex mtx;void block_area(){std::unique_lock<std::mutex> lock(mtx);//...临界区  
}int main(){std::thread thd1(block_area);thd1.join();return 0;
}#endif#if 0
//3.thread Asynchrony operation
int main()
{//将一个返回值为7的 lambda 表达式封装到 task 中//std::packaged_task 的模板参数为要封装函数的类型std::packaged_task<int()> task([](){return 7;});//获得 task 的 futurestd::future<int> result = task.get_future(); // 在一个线程中执行 taskstd::thread(std::move(task)).detach(); std::cout << "Waiting...";result.wait();//输出执行结果std::cout << "Done!" << std:: endl << "Result is " << result.get() << '\n';
}#endif//4.producer and consumer model demo.
#if 1
int main()
{// 生产者数量std::queue<int> produced_nums;// 互斥锁std::mutex m;// 条件变量std::condition_variable cond_var;// 结束标志bool done = false;// 通知标志bool notified = false;// 生产者线程std::thread producer([&]() {for (int i = 0; i < 5; ++i) {std::this_thread::sleep_for(std::chrono::seconds(1));// 创建互斥锁std::unique_lock<std::mutex> lock(m);std::cout << "producing " << i << '\n';produced_nums.push(i);notified = true;// 通知一个线程cond_var.notify_one();}done = true;cond_var.notify_one();});// 消费者线程std::thread consumer([&]() {std::unique_lock<std::mutex> lock(m);while (!done) {while (!notified) { // 循环避免虚假唤醒cond_var.wait(lock);}while (!produced_nums.empty()) {std::cout << "consuming " << produced_nums.front() << '\n';produced_nums.pop();}notified = false;}});producer.join();consumer.join();
}
#endif

这篇关于C++11单/多线程总结(三十五)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/968670

相关文章

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

C++构造函数中explicit详解

《C++构造函数中explicit详解》explicit关键字用于修饰单参数构造函数或可以看作单参数的构造函数,阻止编译器进行隐式类型转换或拷贝初始化,本文就来介绍explicit的使用,感兴趣的可以... 目录1. 什么是explicit2. 隐式转换的问题3.explicit的使用示例基本用法多参数构造

C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

《C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解》:本文主要介绍C++,C#,Rust,Go,Java,Python,JavaScript性能对比全面... 目录编程语言性能对比、核心优势与最佳使用场景性能对比表格C++C#RustGoJavapythonjav

C# List.Sort四种重载总结

《C#List.Sort四种重载总结》本文详细分析了C#中List.Sort()方法的四种重载形式及其实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录1. Sort方法的四种重载2. 具体使用- List.Sort();- IComparable

C++打印 vector的几种方法小结

《C++打印vector的几种方法小结》本文介绍了C++中遍历vector的几种方法,包括使用迭代器、auto关键字、typedef、计数器以及C++11引入的范围基础循环,具有一定的参考价值,感兴... 目录1. 使用迭代器2. 使用 auto (C++11) / typedef / type alias

SpringBoot项目整合Netty启动失败的常见错误总结

《SpringBoot项目整合Netty启动失败的常见错误总结》本文总结了SpringBoot集成Netty时常见的8类问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、端口冲突问题1. Tomcat与Netty端口冲突二、主线程被阻塞问题1. Netty启动阻

SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)

《SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)》本文总结了SpringBoot项目整合Kafka启动失败的常见错误,包括Kafka服务器连接问题、序列化配置错误、依赖配置问题、... 目录一、Kafka服务器连接问题1. Kafka服务器无法连接2. 开发环境与生产环境网络不通二、序

C++ scoped_ptr 和 unique_ptr对比分析

《C++scoped_ptr和unique_ptr对比分析》本文介绍了C++中的`scoped_ptr`和`unique_ptr`,详细比较了它们的特性、使用场景以及现代C++推荐的使用`uni... 目录1. scoped_ptr基本特性主要特点2. unique_ptr基本用法3. 主要区别对比4. u

C++11中的包装器实战案例

《C++11中的包装器实战案例》本文给大家介绍C++11中的包装器实战案例,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录引言1.std::function1.1.什么是std::function1.2.核心用法1.2.1.包装普通函数1.2.