![](https://img-blog.csdnimg.cn/20190927151053287.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
CCIA
文章平均质量分 60
C++ Concurrency in Action
mrbone11
这个作者很懒,什么都没留下…
展开
-
C++-线程的join和detach
文章目录线程管理基础启动线程C++'s most vexing parsejoin或detach在发生异常的情况下joindetach线程管理基础启动线程每个程序至少有一个线程:执行main()函数的线程,其余线程有其各自的入口函数。线程与原始线程(以main()为入口函数的线程)同时运行。使用C++线程库启动线程,可以归结为构造 std::thread 对象,其构造函数传入的参数是可调用对象。void do_some_work();std::thread my_thread(do_some_w原创 2021-11-07 20:27:16 · 4818 阅读 · 0 评论 -
C++-并发相关概念基础
文章目录何为并发并发的两种方式并发途径(实现选择)多进程单进程中多线程比较为什么使用并发关注点分离性能何时不用并发总结何为并发并发是指两个或更多独立的活动同时发生,在计算机领域,并发指的是在单系统内同时执行多个任务并发的两种方式单核CPU的并发与多核CPU的并发不同,前者是通过在多个任务之间快速切换实现假并发,多核则是硬件并发,多个任务同时执行。任务上下文切换在这两种场景下有微妙的不同并发途径(实现选择)多进程进程间传递数据通过信号、套接字、文件、管道等方式,缺点:设置复杂、速度慢、开销大。优原创 2021-11-06 12:49:22 · 562 阅读 · 0 评论 -
C++-线程同步基础之条件变量
线程同步基础并发场景下,有时我们并不仅仅想保护数据,我们还希望多个线程之间同步某些操作,例如等待某个条件为真或者某个事件发生时执行一些操作。C++标准库提供了条件变量(condition variables)和futures;并发技术规范(Concurrency Technical Specification (TS))提供了latches和barriers。条件变量标准库中提供两种条件变量:std::condition_variable和std::condition_variable_any,它们原创 2021-12-04 11:20:45 · 634 阅读 · 0 评论 -
C++-std::promise基本使用
promisestd::promise<T>是一个模板类,提供了set_value方法,可以设置相关联的future的值,相关联的future对象通过get_future方法获取。如果一个promise对象没有调用set_value就被销毁,关联的future的get调用将会抛出异常。future<int> f;{ promise<int> p; f = p.get_future();}cout << f.get()<< endl;原创 2021-12-06 23:56:06 · 1370 阅读 · 0 评论 -
C++-std::async与std::future基本使用
async与future当我们需要开启一个异步任务并在之后某个时刻获取结果时,可以使用std::async,其参数类似std::thread,但是它返回的是一个future对象,最终将包含任务执行的结果。在需要获取异步结果的地方,调用std::future::get,该方法将阻塞直到进入ready状态并返回结果std::future<int> the_answer=std::async(find_the_answer_to_ltuae);do_other_stuff();std::cou原创 2021-12-04 20:04:47 · 1307 阅读 · 0 评论 -
C++-std::thread之向线程函数传递参数
文章目录向线程函数传递参数向线程函数传递参数向线程函数传递参数只需要向std::thread构造函数传递额外的参数即可std::thread t(hello,arg1,arg2);需要注意的是,参数会被拷贝到单独的存储空间中,然后作为右值传递给可调用对象。void f(int i,std::string const& s);std::thread t(f,3,"hello");这里"hello"作为const char *传递给构造函数,并且只在新线程的上下文中转换为string类原创 2021-11-08 23:22:06 · 7963 阅读 · 0 评论 -
C++-线程池最少的实现代码
文章目录前言思路实现前言这段时间看了《C++并发编程实战》的基础内容,想着利用最近学的知识自己实现一个简单的线程池。思路个人对线程池的理解是:利用已经创建的固定数量的线程去执行指定的任务,从而避免线程重复创建和销毁带来的额外开销。C++11中,线程我们可以理解为对应一个thread对象,任务可以理解为要执行的函数,通常是耗时的函数。我们的任务多少和顺序并非固定的,因此需要有一个方法能添加指定的任务,任务存放的地方应该是一个任务队列,因为我们的线程数量有限,当任务很多时同时执行的任务数量也有限,因原创 2021-12-26 12:34:44 · 1124 阅读 · 1 评论 -
C++-设计基于锁的并发数据结构
设计基于锁的并发数据结构为并发性设计数据结构意味着多个线程可以同时访问数据结构,执行相同或不同的操作,并且每个线程都将看到数据结构的自洽视图。数据不会丢失,不变式不会被打破,也不会有竞争条件,我们就说数据结构是线程安全的。设计基于锁的并发数据结构的所有问题都是围绕着“保证访问数据时互斥锁被正确地锁上”和“最大程度地减少锁的持有时间”展开的。设计时,我们需要考虑的问题:数据结构的不变式是什么?线程安全性。如果一个线程通过函数访问数据,有哪些函数是可以安全地从另一个线程调用的?a. 通常构造和析构原创 2022-03-16 21:39:07 · 829 阅读 · 0 评论 -
C++-std::unique_lock介绍和简单使用
unique_lockstd::unique_lock比std::lock_guard更灵活,这种灵活性主要体现在以下几点:lock_guard在构造时或者构造前(std::adopt_lock)就已经获取互斥锁,并且在作用域内保持获取锁的状态,直到作用域结束;而unique_lock在构造时或者构造后(std::defer_lock)获取锁,在作用域范围内可以手动获取锁和释放锁,作用域结束时如果已经获取锁则自动释放锁。lock_guard锁的持有只能在lock_guard对象的作用域范围内,作用域原创 2021-11-29 21:38:31 · 21828 阅读 · 0 评论 -
C++-std::packaged_task基本使用
packaged_taskstd::packaged_task将一个future对象与函数或可调用对象相关联,当std::packaged_task对象被调用时,与之关联的函数或可调用对象被执行,执行结束后future对象变为ready状态并保存相关结果。传递给std::packaged_task的模板参数是函数签名,如void()或int(std::string&,double*),而构造对象时传入的函数或可调用对象的参数和返回值必须一样或可转换为签名中对应的类型,如构造std::package原创 2021-12-05 21:02:54 · 705 阅读 · 0 评论 -
C++-层次锁实现
层次锁实现:#include <mutex>using namespace std;class hierarchical_mutex{ std::mutex internal_mutex; unsigned long const hierarchy_value; unsigned long previous_hierarchy_value; static thread_local unsigned long this_thread_hierarchy_value; void原创 2021-11-25 22:16:28 · 694 阅读 · 0 评论 -
C++-atomic类型介绍
atomicstd::atomic是一个模板类,模板参数为数据类型。atomic对象的一个重要特性就是多线程同时读写该变量时不会产生竞争条件,任意时刻只有一个线程对这个资源进行访问。#include <thread>#include <vector>#include <iostream>using namespace std;int n;atomic<int> atomic_n;void adder1(){ for (int i =原创 2022-01-01 22:34:49 · 2253 阅读 · 4 评论 -
C++-多线程数据共享问题和互斥锁
文章目录线程数据共享问题不变式与竞争条件避免竞争条件互斥锁线程数据共享问题多线程的优势之一就是线程之间可以共享数据,但我们需要一套规则规定哪个线程可以访问哪部分数据,什么时候可以访问,以及怎么通知其他关心该数据的线程已经更新了数据,如果不能处理好数据共享的问题,多线程的这个优势也会变为劣势。线程间共享数据的所有问题都是因为对数据的修改,一个只读的数据不会造成任何问题。不变式与竞争条件这里要提到一个概念:不变式(invariant),意思是关于特定数据结构的陈述始终正确。例如:“x变量保存着列表中元原创 2021-11-14 10:38:14 · 1898 阅读 · 0 评论 -
C++-死锁
死锁当一个操作需要两个及以上的互斥锁,就可能发生死锁。多个线程分别已经获取到其中一个互斥锁,而它们又在互相等待其他线程释放对方的互斥锁,从而导致死锁。注意,当线程相互等待时,也会造成“死锁”,即使两个线程内都没有“锁”。避免死锁通常情况下,避免死锁的建议之一是将多个互斥锁总是以相同的顺序锁住。例如有两个互斥锁A和B,我们总是保证先获取互斥锁A再获取互斥锁B。但在某些情况下,要保证这一点会很困难,例如每个对象内都有一个互斥锁。考虑有一个类包含一个互斥锁成员,一个交换数据的方法swap,现在有两个该类的原创 2021-11-21 21:51:20 · 2343 阅读 · 0 评论 -
C++-可返回结果的线程池
前言之前写的C++线程池无法返回线程执行的返回结果,本篇博客对线程池进行改写,使其可以返回线程执行完成后的结果。分析C++11提供了packaged_task模板类,可以非常方便的将任务和结果进行分离,将任务放到线程中执行,执行完成时,自动设置关联的结果。addTask接口传入一个lambda表达式个人认为是比较方便的,而返回值我们可以修改为返回一个future,这样调用方可以根据需要在恰当的时机去get结果。由于不同的任务可能返回不同的结果,因此这个函数需要改成模板函数实现先贴一下原addT原创 2022-03-15 14:13:59 · 1642 阅读 · 0 评论