![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++多线程
深入学习C++
Ch_zaqdt
这个作者很懒,什么都没留下…
展开
-
C++11 atomic原子操作
在并发多线程的编程中,不同线程间对共享内存的竞争是存在一定危险的。所以C++11引入了自己的互斥量的概念来避免在多线程的运行中出现的问题,那么对于每次的加锁解锁以及其他的操作对于资源的消耗都是一定的,那么就又引入了std::atomic的类模板,实现了原子操作,从而避免了在数据的修改过程中被切换到另一个线程中,也就是说对于值的修改操作必须一次性执行完毕,中途不会被打断。atom...原创 2020-02-12 11:29:03 · 410 阅读 · 0 评论 -
C++11多线程shared_future
对于future的讲解可以去看这篇博客:std::future,那么对于future来说,因为它的get()函数中实现的是移动语义,所以对于future获取的值,只能get一次,那么如果有多个线程需要对其多次取值的话就需要用shared_future了。shared_future可以通过future对象,来将其转换成shared_future的对象,也可以直接通过shared_...原创 2020-02-09 17:05:10 · 923 阅读 · 0 评论 -
C++11异步编程(std::async, std::future, std::packaged_task, std::promise)
std::async是一个函数模板,会启动一个异步任务,最终返回一个std::future对象。在之前我们都是通过thread去创建一个子线程,但是如果我们要得到这个子线程所返回的结果,那么可能就需要用全局变量或者引用的方法来得到结果,这样或多或少都会不太方便,那么async这个函数就可以将得到的结果保存在future中,然后通过future来获取想要得到的结果。async比起...原创 2020-02-08 21:32:25 · 807 阅读 · 1 评论 -
C++ 条件变量(condition_variable)
先贴一个condition_variable的讲解:https://en.cppreference.com/w/cpp/thread/condition_variable,很详细也很全面,但是是英文的,劝退了一部分英语不好的人(也包括我),但是借助翻译还是大概可以看下来的,而且里面的两个代码也很有代表性,使用的生产者消费者模式,推给大家。 condition_v...原创 2020-02-07 20:51:52 · 1056 阅读 · 0 评论 -
C++11单例设计模式(双检查锁)
单例设计模式就是一个类只能实例化出一个对象,不能实例化出多个对象,单例模式分为两种,一种是饿汉单例模式,是指在类创建的时候就已经实例化出了一个对象,好处是这个模式没有线程安全问题,坏处是浪费资源,不管之后有没有用到,都会先实例化一个对象,代码如下:std::mutex mlock;class Solution {private: Solution() {} st...原创 2020-02-05 21:10:05 · 1398 阅读 · 0 评论 -
C++多线程unique_lock详解
C++11中的unique_lock使用起来要比lock_guard更灵活,但是效率会第一点,内存的占用也会大一点。同样,unique_lock也是一个类模板,但是比起lock_guard,它有自己的成员函数来更加灵活进行锁的操作。 使用方式和lock_guard一样,不同的是unique_lock有不一样的参数和成员函数。它的定义是这样的:std::un...原创 2020-02-05 13:30:44 · 1387 阅读 · 0 评论 -
C++ 多线程死锁(引入lock函数)
上一篇博客讲了互斥锁(传送门)的用法,解决了多线程共享资源可能会造成的一些问题,那么引入了锁以后,其实也难免会造成一些问题,比如说忘记unlock,或者有两个锁a和b,一个锁a在等待锁b的解锁,锁b在等待锁a的解锁,这些情况都会造成程序的死锁,比如下面这个例子:#include <iostream>#include <thread>#inclu...原创 2020-02-04 17:43:26 · 1270 阅读 · 0 评论 -
C++ 多线程互斥锁(mutex,lock,lock_guard)
对于互斥锁我们要先知道为什么要用互斥锁?它能解决什么问题? 根据这两个问题,可以来举个例子说明一下,假如现在我们要求1-10000的和,然后我们为了提高效率,我们建立两个线程同时去计算[1,5000)的和以及[5000,10001)的和,那么用于计算和的变量都用相同的ans来获取结果,代码如下:#include <iostream>#incl...原创 2020-02-04 16:39:56 · 1868 阅读 · 0 评论 -
std::ref函数
C++11 的std::ref函数就是为了解决在线程的创建中等过程的值拷贝问题,下面将会用一个线程的创建来展示ref函数的作用。首先我们先来写一个以类对象为参数的线程的创建,先来看一下下面的这个代码:#include <iostream>#include <thread>using namespace std;class A {pub...原创 2020-02-02 19:00:15 · 4800 阅读 · 0 评论 -
C++ 测量程序运行时间
直接上代码吧,可以用于测量某段代码或者某个函数的运行时间,封装成了一个模板。#include <iostream>#include <thread>template<class T>void measure(T&& func) { using namespace std::chrono; auto start = syst...原创 2020-02-01 18:22:33 · 834 阅读 · 0 评论 -
C++多线程的多种创建方式
C++11的新特性std::thread的创建方式主要有:函数指针,类或结构体,lambda表达式。下面将会附上这三种创建线程方式的code。首先第一个是通过函数指针的方式来创建:不带参数:#include <iostream>#include <thread>using namespace std;void A() { c...原创 2020-02-01 17:09:37 · 1139 阅读 · 0 评论 -
C++多线程中的join, detach, joinable
thread是C++11中提供多线程编程的模块,使用的时候需要包含<thread>头文件。 首先我们先来看一下简单的hello world的多线程的代码(win10下vs2019) 这个创建的方式就是以函数作为一个入口,创建了一个子线程,那么创建的语句就是第11行代码所示,所传入的参数就是入口的函数名。在创建了这个子线程之后...原创 2020-02-01 16:08:30 · 10074 阅读 · 2 评论