C++并发
并发编程
baboon_chen
My piano is the keyboard
展开
-
13 —— 线程池的简单实现
线程池的简单实现文章目录线程池的简单实现一 线程池的定义二 使用线程池的原因三 用C++实现一个简单的线程池3.1 thread_pool.h3.2 thread_pool.cpp3.3 thread_pool_use.cpp3.4 编译生成 test 可执行程序3.5 输出结果 一 线程池的定义 线程池就是有一堆已经创建好了的线程,初始都处于空闲等待状态,当有新的任务需要处理的时候,...原创 2020-03-24 23:55:54 · 155 阅读 · 0 评论 -
POSIX 多线程开发
POSIX 多线程开发文章目录POSIX 多线程开发一 线程的创建二 线程的属性1 分离状态2 栈尺寸3 调度策略三 线程的结束四 线程退出时的清理机会 一 线程的创建 POSIX API中,创建线程的函数是 pthread_create,声明如下:int pthread_create(pthread_t *pid, const pthread_attr_t *attr, (voi...原创 2020-03-18 13:03:50 · 398 阅读 · 0 评论 -
进程间通信(IPC):消息队列
进程间通信(IPC):消息队列消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。特点(1)消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识.(2)消息队列允许一个或多个进程向它写入与读取消息.(3)管道和消息队列的通信数据都是先进先出的原则。(4)消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按...原创 2020-02-25 23:20:15 · 180 阅读 · 0 评论 -
进程间通信(IPC):管道
进程间通信(IPC):管道 文章目录进程间通信(IPC):管道管道的基本概念管道的读写管道的局限性创建管道函数 pipe等待子进程中断或者结束函数 wait管道的使用 管道的基本概念 所谓管道,是指用于连接读进程和写进程,以实现它们之间通信的共享文件。管道是一个固定大小的缓冲区,在Linux中,该缓冲区的大小为一个页面,即4KB。写进程将数据写入管道的一端,读进程从管道另一端读取数据...原创 2020-02-23 18:13:00 · 233 阅读 · 0 评论 -
进程间通信(IPC):信号
进程间通信(IPC):信号量 文章目录进程间通信(IPC):信号量一、信号的基本概念1.1 进程处理信号的行为1.2 linux下的信号量二、信号生命周期和处理流程三、与信号相关的系统调用3.1 使用kill发送信号3.2 使用sigaction查询或设置信号处理方式3.3 使用sigprocmask检测或更改信号屏蔽字3.4 使用sigpending检查是否有挂起的信号3.5 使用signa...原创 2019-11-15 19:34:03 · 262 阅读 · 0 评论 -
12 —— 虚假唤醒、线程数量谈、线程池浅谈
一 虚假唤醒 什么是虚假唤醒?我们先看以前关于condition_variable的例子class A{public: // 把收到的消息传入队列 void inMsgRecvQueue() { for (size_t i = 0; i < 1000; ++i) { cout << "收到消息,并放入队列 " << i << ...原创 2019-06-30 21:36:52 · 228 阅读 · 0 评论 -
11 —— windows临界区、其它mutex互斥量
一 windows临界区#include <iostream>#include <thread>#include <list>#include <mutex>#include <Windows.h>#define __WINDOWSJQ_using namespace std;class A{public: ...原创 2019-06-29 17:42:31 · 152 阅读 · 0 评论 -
10 —— std::async()深入谈
一 std::async()的四种参数使用情况A std::launch::deferred 延迟异步任务调用,并不创建新线程。等future对象调用get()或者wait()时才去执行线程入口函数,如果没调用,则不执行。B std::launch::async 强制这个异步任务在新线程上执行。这意味着系统必须创建出新线程来执行线程入口函数。C std::launch::deferred...原创 2019-06-28 00:34:41 · 600 阅读 · 0 评论 -
9 —— 原子操作std::atomic
一 原子操作概念引出范例#include <iostream>#include <thread>using namespace std;int g_count = 0; // 定义一个全局量,供两个线程同时访问void mythread() // 线程入口函数{ for (int i = 0; i < 10000000; i++) { g_c...原创 2019-06-27 23:44:10 · 734 阅读 · 0 评论 -
8 —— future其它成员函数、shared_future
一 future其它成员函数wait_for() 卡住当前流程,等待std::async()的异步任务运行一段时间,然后返回其状态std::future_status。如果std::async()的参数是std::launch::deferred(延迟执行),则不会卡住主流程。std::future_status 枚举类型,表示异步任务的执行状态。 std::future_sta...原创 2019-06-27 22:49:08 · 392 阅读 · 0 评论 -
7 —— std::async()、future、packaged_task、promise
一 std::async()、std::future创建后台任务并返回值 std::async是个函数模板,用来启动一个异步任务。启动起来一个异步任务之后 ,返回一个std::future对象。std::future是个类模板。 什么叫“启动一个异步任务”,就是创建一个线程并开始执行对应的线程入口函数,它返回一个std::future对象,这个对象含有线程入口函数返回的结果。我们可以通过调...原创 2019-06-24 23:53:27 · 139 阅读 · 0 评论 -
6 ———— 条件变量std::condition_variable
std::condition_variable、notify_one()、wait()1 std::condition_variable 是一个类模板,仅限于与 std::mutex 一起工作2 只有使用std::unique_lock对mutex进行管理,因为在条件变量wait()期间,要对mutex解锁。#include <iostream>#include <t...原创 2019-06-24 22:21:36 · 208 阅读 · 0 评论 -
1 —— C++11 多线程简介
多线程并发线程很像轻量级的进程。在单个进程中运行多个线程,每个线程相互独立运行,且线程可以在不同的指令序列中运行。但进程中的所有线程都共享地址空间,并且所有线程访问到大部分数据———全局变量仍然是全局的,指针、对象的引用或数据可以在线程之间传递。所以一个进程中的两个线程可以通过共享内存进行通信。 由于同一数据的内存地址在不同的进程中是不相同的,所以,进程之间共享内存难以建立,且难以管理...原创 2019-06-04 18:09:55 · 307 阅读 · 0 评论 -
3 —— 多线程的同步和异步
一 创建多个线程#include <iostream>#include <thread>#include <vector>using namespace std;// 线程入口函数void myprint(int num){ cout << this_thread::get_id() << "thread star...原创 2019-06-16 14:21:16 · 1514 阅读 · 1 评论 -
5 —— 多线程中的单例模式、std::call_once()
一 多线程中单例模式的实现方法 在多线程中实现单例模式,最好的办法是在主线程中提前初始化好实例,再开启子线程,从而避免子线程间资源竞争的问题。就是大家所说的饿汉模式:即无论是否调用该类的实例,在程序开始时就会产生一个该类的实例,并在以后仅返回此实例。class SingletonStatic{private: static const SingletonStatic* m_...原创 2019-06-19 23:20:35 · 330 阅读 · 0 评论 -
4 —— unique_lock详解
一 unique_lock取代lock_guard unique_lock是个类模板,工作中,一般使用lock_guard。因为unqiue_lock占用的内存更多,效率底一些。但是unique_lock更加灵活,它的构造函数的第二个参数可以有其它的形式,下面会提到。同时,uniuqe_lock与lock_guard一样自动对绑定的互斥量自动加锁,解锁。二 unique_lock的构造函数...原创 2019-06-19 00:02:05 · 483 阅读 · 0 评论 -
2 —— C++多线程传参
一 传递临时对象作为线程参数示例1 传递临时变量的引用与指针#include <iostream>#include <thread>using namespace std;void myprint(const int& i, char *str){ cout << i << endl; // --4 cout <&...原创 2019-06-06 11:07:24 · 495 阅读 · 0 评论