C++提升
文章平均质量分 82
C++11等新引入操作
云中飞鸿--**峰
这个作者很懒,什么都没留下…
展开
-
C++ 多进程多线程间通信
在这个示例中,我们创建了一个全局的std::queue<int>作为消息队列,以及一个互斥锁std::mutex和一个条件变量std::condition_variable来同步对消息队列的访问。管道提供了一种半双工的通信方式,一个线程往管道中写入数据,另一个线程从管道中读取数据。信号的接收:当信号被发送到进程时,操作系统会中断该进程的正常流程,并调用相应的信号处理函数(如果已设置)。请注意,这里的互斥锁是在全局命名空间中创建的(通过前缀"Global\\"),这意味着它可以在系统范围内的任何进程中访问。转载 2024-10-09 18:07:08 · 247 阅读 · 0 评论 -
从不同角度看c++并发
https://github.com/forhappy/Cplusplus-Concurrency-In-Practice/tree/master参考原文:开源图书:《C++ 并发编程指南》|Linux.CN原创 2024-10-09 17:53:17 · 126 阅读 · 0 评论 -
C++ 11线程池
std::packaged_task 包装一个可调用的对象,并且允许异步获取该可调用对象产生的结果,从包装可调用对象意义上来讲,std::packaged_task 与 std::function 类似,只不过 std::packaged_task 将其包装的可调用对象的执行结果传递给一个 std::future 对象。如果我们在多个线程中对这些类型的共享资源进行操作,编译器将保证这些操作都是原子性的,也就是说,确保任意时刻只有一个线程对这个资源进行访问,编译器将保证,多个线程访问这个共享资源的正确性。转载 2024-10-09 15:59:23 · 145 阅读 · 0 评论 -
C++11 - thread多线程编程,线程互斥和同步通信,死锁问题分析解决
在多线程环境中运行的代码段,需要考虑是否存在竞态条件,如果存在竞态条件,我们就说该代码段不是线程安全的,不能直接运行在多线程环境当中,对于这样的代码段,我们经常称之为临界区资源,对于临界区资源,多线程环境下需要保证它以原子操作执行,要保证临界区的原子操作,就需要用到线程间的互斥操作-锁机制,thread类库还提供了更轻量级的基于CAS操作的原子操作类。如果消费者线程去消费产品,发现还没有产品生产出来,它需要通知生产者线程赶快生产产品,等生产者线程生产出产品以后,消费者线程才能继续往下执行。转载 2024-10-08 13:41:20 · 232 阅读 · 0 评论 -
C++并发编程实战
第二种,如果在当前线程中,调用 std::this_thread::get_id() (这个函数定义在 头文件中)也可以获得线程标识。每个 std::thread 只能被进行一次 join() 或 detach(),操作后 joinable() 由 true 变为 false。改成=》std::thread t(f, 3, std::string(buffer));如果转移到一个已经关联的线程,会抛出异常!(一个线程只能关联一个线程任务(线程函数),如果给他关联多个会出错!原创 2024-09-27 15:54:51 · 689 阅读 · 0 评论 -
STL库中有哪些多种线程同步的方法
:事件对象用于线程间的同步。类提供了一种基本的同步机制,可以防止多个线程同时访问共享资源,确保每次只有一个线程能够获得锁并执行临界区的代码,而其他线程则被阻塞,直到锁被释放1。:除了基本的互斥锁外,STL还提供了读写锁,允许多个线程同时读取共享资源,但写入时仍然需要互斥访问,这适用于读多写少的场景,可以提高并发性能。模板类提供了一组原子操作,这些操作在多线程环境中是安全的,可以确保操作的原子性,避免数据竞争和不一致的状态2。),而其他线程则可以通知等待的线程条件已经满足,从而唤醒它们继续执行。原创 2024-09-25 11:29:56 · 244 阅读 · 0 评论 -
C++ 异步编程中:future与promise、packaged_task、async
std::launch::async | std::launch::deferred参数:是默认行为(可省略)。=》std::async真的是来帮忙的,你不用再想到底该怎么用std::future、std::promise和 std::packaged_task了,在已经有了td::future、std::promise和std::packaged_task的情况下,实现异步或多线程间通信,事实上std::promise::set_xxx函数会改变std::promise的状态为ready,原创 2024-09-23 16:37:52 · 1027 阅读 · 0 评论 -
C++11新标准中10个C++11特性
在C++11新标准中,语言本身和标准库都增加了很多新内容,本文只涉及了一些皮毛。不过我相信这些新特性当中有一些,应该成为所有C++开发者的常规装备。你也许看到过许多类似介绍各种C++11特性的文章。下面是我总结的,C++开发者都需要学习和使用的C++11新特性。转载 2024-09-19 17:42:53 · 398 阅读 · 0 评论 -
c++之function和bind详解
由于可变模版参数的类型和个数是不固定的,所以我们可以传任意类型和个数的参数给函数f。我们无法直接获取参数包args中的每个参数,只能通过展开参数包的方式来获取参数包中的每个参数,这是使用可变模版参数的一个主要特点,也是最大的难点,即如何展开可变模版参数。可变模板参数和普通的模板参数语义是一致的,所以可以应用于函数和类,即可变模板参数函数和可变模板参数类,然而,模板函数不支持偏特化,所以可变模板参数函数和可变模板参数类展开可变模板参数的方法还不尽相同,下面我们来分别看看他们展开可变模板参数的方法。转载 2024-09-19 17:36:00 · 164 阅读 · 0 评论 -
C++智能指针
学习C++的人,一直在接触裸指针,一边感受着它的强大,一边感受着它的坑爹。当然,坑不坑爹在于开发者,指针本身近乎完美,但奈何用的人比较猥琐,给自己埋下无数的坑,还哭喊着指针不好用,那么今天要介绍的智能指针可以释放大家在使用裸指针时的一些压力,当然智能指针无法替代裸指针的全部功能。裸指针到底有什么不好,写过一些C++代码的人应该都能知道,比如下面的原因:1.忘记释放资源,导致资源泄露(常发生内存泄漏问题)2.同一资源释放多次,导致释放野指针,程序崩溃。转载 2024-09-18 10:45:12 · 246 阅读 · 0 评论 -
对象优化1、C++编译器对于“ 创建新对象”时的优化
静态变量,程序运行的时候,它的内存已经存在了,因为数据段内存是事先就分配好了。因为,临时对象的生命周期只在当前语句内,出了这条语句,临时对象析构 不复存在。此外,还提到了对象构造和析构的调用顺序,以及函数参数传递和返回对象时的优化原则,强调了使用引用和初始化接收返回值的重要性。时候,将会避免临时对象的生成(将临时对象优化掉了,就不产生临时对象了);用临时对象生成新对象时, 临时对象就不产生了,直接构造新对象即可。显示生成临时对象,然后给t2赋值,之后析构临时对象;1. 指针指向临时对象,是不安全的!转载 2024-09-15 14:58:16 · 107 阅读 · 0 评论 -
对象优化3、右值引用:从move移动语义=》到 类型完美转发forward
原文链接:https://blog.csdn.net/LIJIWEI0611/article/details/121451239。由于接收是Ty &&val;左值引用+右值引用=左值引用 最终依然是一个左值引用;对左值引用和右值引用分别使用不同的模板函数,都返回了 static_cast(_Arg)4、使用void push_back(Ty &&val)为什么可以识别左值和右值呢?3、vector右值引用的push_back方法。左值引用+右值引用=左值引用。右值引用+右值引用=右值引用。原创 2024-09-15 12:01:33 · 824 阅读 · 0 评论 -
对象优化2、有些场景,无法直接返回临时对象,此时,用右值引用参数比 左值引用参数拷贝构造和赋值函数 效率高
函数的主要目的是:将一个左值对象转换为右值引用,从而触发。不能将右值转换为左值引用!原创 2024-09-15 11:49:33 · 211 阅读 · 0 评论