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

相关文章

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基