线程库
文章平均质量分 82
pthread和C++11线程库
我什么都布吉岛
Keep writing,Keep thinking!
展开
-
C++11线程库 (一) 构造函数及其成员
引入:我们都知道一个程序的入口在主函数main开始,那么作为线程也应该有一个自己入口函数。创建一个线程第一步就是要创建一个自己的入口函数。一、std::thread 类模板和使用std::string引用头文件#include <string>一样,使用thread童谣要引用头文件#include <thread>,使用类模板,只需要传入合适的参数(函数、类的成员函...原创 2019-02-28 17:47:54 · 569 阅读 · 0 评论 -
C++11线程库 (二) 管理当前线程
命名空间std::this_thread定义了四个管理当前线程的方法:yield 重新安排线程时间片,允许其他程序先执行void yield() noexcept;get_id 返回当前线程的idstd::this_thread::id get_id() noexcept;sleep_for 暂停当前线程执行一段特定时间[1]template< class Rep, class Period >void sleep_for( const std::chrono::原创 2021-02-27 16:06:17 · 257 阅读 · 0 评论 -
C++11线程库 (三) 创建一个线程
在文章C++11线程库 (一) 构造函数及其成员中我们知道我们有一下构造方法:thread() noexcept;//since c++11thread(thread&& other) noexcept;//since c++11template<class Function,class ...Args>explicit thread(Function &&f,Args && ...args);//since c++11thread(co原创 2021-02-27 23:36:00 · 302 阅读 · 0 评论 -
C++11线程库 (四) 互斥量
互斥锁的出现其实就是为了完成线程之间数据的同步和有序访问,防止由于多个线程同时进行写,或者一个读一个写导致的数据脏读的情况。有一种锁叫做自旋锁,互斥锁属于sleep-waiting类型的锁,自旋锁属于busy-waiting类型的锁,后者适合占用时间非常短的临界区。C++标准库支持的几种互斥锁类型如下:#mermaid-svg-AJ6TVhNsTMpnlmvG .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--me.原创 2021-02-28 00:49:28 · 223 阅读 · 0 评论 -
C++11线程库 (五) 互斥锁管理工具
在使用互斥锁时要相当小心,如果某个线程忘记调用unlock()就返回,那么其他线程将永远拿不到线程锁。C++实现了对互斥锁的管理,管理所用到类模板和常量都定义在#include <mutex>,利用作用域以及析构函数完成资源的自动管理,避免出现死锁的情况。有一个类是用于控制管理工具加锁行为的:struct defer_lock_t { explicit defer_lock_t() = default; };struct try_to_lock_t { explicit try_to_lo原创 2021-02-28 22:17:03 · 309 阅读 · 1 评论 -
C++11线程库 (六) 条件变量 Condition variables
条件变量是一个线程同步术语,它允许多个线程相互通信。他可以让一部分线程等待(可能超时)另一个线程可能发出的继续执行通知,条件变量与总是和互斥锁相关。————cppref对于条件变量的描述一、为什么需要条件变量?简单来说,条件变量可以完成一些特定场合互斥锁不能(高效)完成的工作。他是多线程编程中“等待-唤起”逻辑的基础,条件变量利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使“条件成立”。等待端需要互斥锁的原因是防止在进入等待状态(.原创 2021-03-03 21:26:57 · 4381 阅读 · 0 评论 -
C++11线程库 (七) 线程的停止
在这篇文章里,我们将会讨论如何在C++11下停止和终止一个线程。为什么C++11不直接提供一个停止线程的方法?这是因为线程在停止之前可能有一些资源需要被释放、关闭,比如说:线程中已经获取锁的所有权,突然退出谁将会负责这个锁所有权释放?如果线程打开了一写文件流,谁将会回收这个文件资源?如果线程中有动态内存分配,内存泄露如何避免?简单来说就是线程退出时可能有资源需要回收,而C++11无法知晓用户具体有哪些资源。虽然如此,但是我们仍可以通过简单的方式实现线程退出:即定时检查或者程序中某个节点检查,检翻译 2021-10-29 10:20:47 · 8299 阅读 · 2 评论 -
QT多线程简单使用
QT的多线程相较于Linux/Unix的pthread和C++11的thread,基本一致,只不过QThread因为要利用信号与槽的机制,所有的线程都是通过继承QObject来实现的。一、QT历史上的两种使用多线程继承QThread对象QRunnable方法moveToThread方法QtConcurrent::run方法关于每一种方法的优缺点可以查看这位博主的总结Qt中使用线程的几种方式及区别,因为项目中使用的多线程不需要频繁的创建和销毁,所以使用了第三种方法moveToThread方法。原创 2020-07-29 00:30:38 · 2981 阅读 · 0 评论 -
进程、线程、并发和并行概念
一、进程和线程进程是一个运行起来的可执行程序。进程有三种状态:就绪 进程获得了除了CPU外所有必要资源运行 进程获得了所有资源,开始执行阻塞 进程正在尚未满足要求,正在等待线程是程序执行流的最小单位(要执行,最起码是一个线程)二、线程和进程的联系和线程一些常识2.1 线程和进程之间的联系进程必有唯一的主线程进程和主线程同时创建同时结束线程切换要比进程切换要快2.2 线...原创 2019-02-28 17:46:51 · 471 阅读 · 0 评论 -
POSIX线程库(一)创建第一个pthread线程
对于这个简单的示例,步骤非常简单:创建线程-线程退出-同步退出。一、使用前的准备定义宏 __REENTRANT,开启可重入功能引用头文件 #include<pthread.h>编译链接库 -lpthread二、创建一个线程pthread_create()函数的原型如下:int pthread_create(pthread_t * thread,pthread_attr_t * attr,\void *(*start_rountine)(void *),void * arg.原创 2020-07-13 23:27:44 · 481 阅读 · 0 评论 -
POSIX线程库(二)线程同步轮询技术——一种笨笨方法
什么是轮询?“同步就是协同步调,按预定的先后次序进行运行。如:你说完,我再说。“同”字从字面上容易理解为一起动作其实不是,“同”字应是指协同、协助、互相配合[1]。下面展示这个程序,完成了A B协调,A打印后B打印。设置了一个全局变量value,value更像是一种标记,当对方线程尚未完成其操作时将会等待,当对方线程完成就会让对方等待,自己执行。程序#include <stdio.h>#include <unistd.h>#include <stdlib.h>原创 2020-07-14 22:09:02 · 285 阅读 · 0 评论 -
POSIX线程库(三)线程同步——信号量
一、信号量是什么?为什么需要用信号量?在POSIX线程库(二)线程同步轮询技术——一种笨笨方法 简单的变量+延迟的方法是一种非常不聪明的方法,主要原因是普通变量不能保证原子性,同时对标志的操作可能导致预料外的效果。荷兰科学家Dijkstra提出信号量的概念,它是一种特殊的变量,可以被递增递减,当两个或以上线程对这个信号量进行改变,由系统按顺序完成线程的请求。信号量常用来保护一段代码,保证一次只能被一个线程执行。二、信号量API使用一个信号量,其基本步骤是:声明一个信号量初始化一个信号量线程1使原创 2020-07-31 13:14:05 · 235 阅读 · 0 评论 -
POSIX线程库(四)线程同步——互斥量
互斥量与信号量非常相似,他允许程序员每一次锁住某个变量,使得每一次只能有一个线程访问他。一、信号量是什么?和信号量一样,互斥量用于保护一段代码的,保证一次只能被一个线程执行。二、信号量API使用一个信号量,其基本步骤是:声明一个互斥量初始化一个互斥量线程1使用pthread_mutex_lock获取执行权线程2使用pthread_mutex_unlock释放执行权销毁互斥量pthread_mutex_destory线程头文件本身就有互斥量的定义,#include <pthr.原创 2020-08-02 22:23:47 · 183 阅读 · 0 评论