互斥量(mutex)的基本概念 互斥量的用法 lock(), unlock() std::lock_guard类模板 死锁 死锁演示 死锁的一般解决方案 std::lock()函数模板 std::lock_guard的std::adopt_lock参数 互斥量(mutex)的基本概念 线程保护共享数据,操作时,某个线程用代码把共享数据锁住,其他想操作共享数据的线程必须等待:等待解锁,其他线程才能继续操作共享数据. 1)锁定住 2)操作 3)解锁 "互斥量"的基本概念,互斥量是个类对象,…
std::future的其他成员函数 std::shared_future 原子操作.概念.基本用法 多线程主要是为了执行某个函数,本文的函数的例子,采用如下写法 int mythread() { cout << "my thread start, and thread id is " << std::this_thread::get_id() << endl; std::chrono::milliseconds dura(1000); std::t…
设计模式 共享数据分析 call_once 设计模式 开发程序中的一些特殊写法,这些写法和常规写法不一样,但是程序灵活,维护起来方便,别人接管起来,阅读代码的时候都会很痛苦.用设计模式理念写出来的代码很晦涩,国内的05~10年的时候有一本"Head First",写程序的时候谈到设计模式. 项目开发经验+模块开发经验=设计模式 先有开发需求,然后把一个大的工程拆分很很多小的模块,然后演变出设计模式.当设计模式传到国内来的时候,很多程序员写代码把设计模式往代码中套,使得一个很小的程序的变…
创建和等待多个线程 数据和共享问题分析 只读的数据 有读有写 其他案例 共享数据的保护案例代码 创建和等待多个线程 服务端后台开发就需要多个线程执行不同的任务.不同的线程执行不同任务,并返回执行结果.很多个线程都用同一个线程入口: void myprint(int num) { cout << "线程开始执行了: " << num << endl; cout << "My print id: "<<this…
condition_variable wait() notify_one notify_all condition_variable 条件变量的实际用途: 比如有两个线程A和B,在线程A中等待一个条件满足,(消息队列中有要处理的消息),线程B专门往队列中丢数据.当B往线程中放入数据,同时B通知线程A,开始往下执行.在服务器的后台设计中,有一个线程,阻塞式地读取消息,并且将其解析,放入队列中,此时线程B还通知A,要从队列中去拿请求,并进行处理. a) socket技术使得服务器中的程序能够像打开文…
unique_lock 取代lock_quard unique_lock 的第二个参数 std::adopt_lock std::try_to_lock std::defer_lock unique_lock的成员函数 lock() unlock() try_to_lock() release() unique_lock所有权的传递 unique_lock 取代lock_guard 应用场景:两个线程A.B,其中A对队列添加元素,B移除元素. unique_lock是个类模板,工作中,一般使用l…
基本概念 并发 可执行程序.进程.线程 学习心得 并发的实现方法 多进程并发 多线程并发 总结 C++标准库 基本概念 (并发.进程.线程)区分C++初级编程和中高级编程 并发 两个或者更多的任务同时进行:一个程序同时执行多个任务,这些任务之间是相互独立的,以往的计算机只有单核CPU的时候,某个时刻只能执行一个任务. 微观上串行,宏观上并行 1.单核CPU操作系统调度,每秒钟进行任务切换,看起来好像是多任务同时进行,实际上通过切换而来.不同任务之间需要的资源不一样,在切换的时候需要保存一些变量,…
std::atomic std::async std::atomic 一般atomic原子操作,针对++,--,+=,^=是支持的,其他结果可能不支持. 注意 std::atomic<int> g_varibale = 0; .... int f(){ g_varibale = g_varibale +1; //这样的写法有问题 } 很多时候,写程序简单就是美,不太建议把程序写得复杂.多线程程序要求稳定,然后在稳定的基础上去扩展功能. std::async参数详解 async是用来创建一个异步…
传递临时对象 陷阱 总结 临时对象作为线程参数 线程id的概念 临时对象构造时的抓捕 成员函数指针做线程函数 传递临时对象作为线程参数 创建的工作线程不止一个,线程根据编号来确定工作内容.每个线程都需要知道自己的编号.线程中有很多容易犯错的写法 例子1 多线程需要执行的函数: void my_print(const int &i, char* p_mybuff) { cout << i << endl; cout << p_mybuff << end…
async future packaged_task promise async std:async 是个函数,用来启动一个异步任务,启动起来一个异步任务之后,返回一个std::futre对象,启动一个异步任务,就是自动创建一个线程并开始执行对应的线程入口函数,它返回一个std::future对象,这个std::future对象里面就含有线程入口函数返回的结果.可以通过调用future对象的成员函数get来获取结果. "future" 提供了一种访问异步操作结果的机制,程序运行的结果,…