avatar
文章
864
标签
158
分类
0

主页
文章归档
文章标签
文章归类
文章列表
  • Music
  • Movie
友情链接
关于我
麦溪·在路上
主页
文章归档
文章标签
文章归类
文章列表
  • Music
  • Movie
友情链接
关于我

麦溪·在路上

C++并发编程之互斥锁pthread_mutex_init函数
发表于2022-01-05
[TOC] 概述linux下为了多线程同步,通常用到锁的概念。 posix下抽象了一个锁类型的结构:ptread_mutex_t。通过对该结构的操作,来判断资源是否可以访问。顾名思义,加锁(lock)后,别人就无法打开,只有当锁没有关闭(unlock)的时候才能访问资源。即对象互斥锁的概念,来保证共享数据操作的完整性。 每个对象都对应于一个可称为” 互斥锁” 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。 使用互斥锁(互斥)可以使线程按顺序执行。通常,互斥锁通过确保一次只有一个线程执行代码的临界段来同步多个线程。 要更改缺省的互斥锁属性,可以对属性对象进行声明和初始化。 通常,互斥锁属性会设置在应用程序开头的某个位置,以便可以快速查找和轻松修改。 头文件: 1#include <pthread.h> 函数原型: 12int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);pthread_mutex_t mutex = P ...
C++并发编程之多线程基础
发表于2022-01-05
[TOC] 概述文章参考:http://shouce.jb51.net/cpp_concurrency_in_action/ 文章参考:https://sanctorum003.github.io/2021/08/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/MultiThreads/C++_MultiThreads/ 多线程并发即多个线程同时执行,一般而言,多线程并发就是把一个任务拆分为多个子任务,然后交由不同线程处理不同子任务,使得这多个子任务同时执行 实现C++多线程并发程序的思路如下:将任务的不同功能交由多个函数分别实现,创建多个线程,每个线程执行一个函数,一个任务就这样同时分由不同线程执行了。 什么时候不适用多线程并发 每创建一个线程,系统要分配给线程相应的栈空间,用于保存上下文信息. 如果线程执行过快导致上下文切换频繁,这将导致收益比不上成本 基础知识创建线程std::ref和std::cref /std::bind std::ref 用于包装按引用传递的值 std::cref 用于包装按const引用传递的值 ...
C++多线程学习之thread学习
发表于2022-01-05
[TOC] 文章参考:https://www.runoob.com/w3cnote/cpp-std-thread.html 文章参考:https://www.cnblogs.com/haippy/p/3236136.html 概述C++11 新标准中引入了四个头文件来支持多线程编程,他们分别是<atomic> ,<thread>,<mutex>,<condition_variable>和<future>。 <atomic>:该头文主要声明了两个类, std::atomic 和 std::atomic_flag,另外还声明了一套 C 风格的原子类型和与 C 兼容的原子操作的函数。 <thread>:该头文件主要声明了 std::thread 类,另外 std::this_thread 命名空间也在该头文件中。 <mutex>:该头文件主要声明了与互斥量(mutex)相关的类,包括 std::mutex 系列类,std::lock_guard, std::unique_lock, 以及其他的类 ...
C++多线程之detach学习
发表于2022-01-05
[TOC] 概述文章参考:https://blog.csdn.net/Trouble_provider/article/details/85268764 在c++ 中,程序默认是只有一个Main Thread运行的,其入口函数是主函数main(),其中若开辟了其他的新的子线程,对这些子线程的处理方式有两种, 一种是Join(),即main thread在被join的子线程没执行完的这段时间里,什么也不做,直到子线程执行完毕,才会继续向下执行 另一种是Detach(),如果没有其他一些同步措施的话,此时 子线程和main thread 完全分离,两个线程自顾自的运行,main thread可以不等子线程运行完,就提前结束。 (ps. 这里有个需要注意的地方,如果主线程 运行完毕了的话,那些被detach的线程也会随着主线程的销毁而被挂起,此时里面本应cout出来显示的内容也将不再显示!!) 所以,此时就有一个问题,如何让 主线程 在被开辟的子线程运行的时候,不只是干等着,也能做自己的事情,等到子线程运行完了,然后再结束主线程呢? 答案是: 利用detach() + 条件变量 ...
C++并发编程之多线程私有数据
发表于2022-01-05
[TOC] 文章参考:https://www.cnblogs.com/zhangxuan/p/6515264.html 在多线程的环境下,进程内的所有线程共享进程的数据空间。因此全局变量为所有线程共享。在程序设计中有时需要保存线程自己的全局变量,这种特殊的变量仅在线程内部有效。 如常见的errno,它返回标准的错误码。errno不应该是一个局部变量。几乎每个函数都应该可以访问他,但他又不能作为是一个全局变量。否则在一个线程里输出的很可能是另一个线程的 出错信息,这个问题可以通过创建线程的私有数据(TSD thread specific data)来解决。在线程内部,私有数据可以被各个函数访问。但他对其他线程是屏蔽的。 线程私有数据采用了一键多值的技术,即一个键对应多个值。访问数据时都是通过键值来访问,好像是对一个变量进行访问,其实是在访问不同的数据。 1int pthread_key_create(pthread_key_t *key, void (*destructor)(void*)); 第一个参数为指向一个键值的指针, 第二个参数指明了一个destructor函数,如果这个参 ...
C++11并发编程之metex互斥量学习
发表于2022-01-05
[TOC] 概述Mutex 又称互斥量,C++ 11中与 Mutex 相关的类(包括锁类型)和函数都声明在 <mutex> 头文件中,所以如果你需要使用 std::mutex,就必须包含 <mutex> 头文件。 什么是互斥量(锁)?mutex头文件介绍Mutex 系列类(四种) std::mutex,最基本的 Mutex 类。 std::recursive_mutex,递归 Mutex 类。 std::time_mutex,定时 Mutex 类。 std::recursive_timed_mutex,定时递归 Mutex 类。 Lock 类(两种) std::lock_guard,与 Mutex RAII 相关,方便线程对互斥量上锁。 std::unique_lock,与 Mutex RAII 相关,方便线程对互斥量上锁,但提供了更好的上锁和解锁控制。 其他类型 std::once_flag std::adopt_lock_t std::defer_lock_t std::try_to_lock_t 函数 std::try_lock,尝试同时对多个互斥量 ...
C++11之unique_lock的基础学习
发表于2022-01-05
[TOC] 文章参考:https://blog.csdn.net/zzhongcy/article/details/85230200 文章参考:https://cloud.tencent.com/developer/article/1583807 概述之前我们学习了lock_guard锁机制 lock_guard 最大的缺点也是简单,没有给程序员提供足够的灵活度,因此,C++11 标准中定义了另外一个与 Mutex RAII 相关类 unique_lock,该类与 lock_guard 类相似,也很方便线程对互斥量上锁,但它提供了更好的上锁和解锁控制。 unique_lock使用起来要比lock_guard更灵活,但是效率会低一一点,内存的占用也会大一点。同样,unique_lock也是一个类模板,但是比起lock_guard,它有自己的成员函数来更加灵活进行锁的操作。 顾名思义,unique_lock 对象以独占所有权的方式( unique owership)管理 Mutex 对象的上锁和解锁操作,所谓独占所有权,就是没有其他的 unique_lock 对象同时拥有某个 Mutex ...
C++11多线程之condition_variable学习
发表于2022-01-05
[TOC] 概述文章转自:https://www.cnblogs.com/haippy/p/3252041.html 文章参考:https://www.cnblogs.com/haippy/p/3252041.html 头文件主要包含了与条件变量相关的类和函数。相关的类包括 std::condition_variable 和 std::condition_variable_any,还有枚举类型std::cv_status。另外还包括函数 std::notify_all_at_thread_exit(),下面分别介绍一下以上几种类型。 std::condition_variable 类介绍std::condition_variable 是条件变量,更多有关条件变量的定义参考维基百科。Linux 下使用 Pthread 库中的 pthread_cond_*() 函数提供了与条件变量相关的功能, Windows 则参考 MSDN。 当 std::condition_variable 对象的某个 wait 函数被调用的时候,它使用 std::unique_lock(通过 std::mutex ...
C++学习线程局部存储相关
发表于2022-01-05
[TOC] 概述在Linux系统中使用C/C++进行多线程编程时,我们遇到最多的就是对同一变量的多线程读写问题,大多情况下遇到这类问题都是通过锁机制来处理,但这对程序的性能带来了很大的影响,当然对于那些系统原生支持原子操作的数据类型来说,我们可以使用原子操作来处理,这能对程序的性能会得到一定的提高。那么对于那些系统不支持原子操作的自定义数据类型,在不使用锁的情况下如何做到线程安全呢?本文将从线程局部存储方面,简单讲解处理这一类线程安全问题的方法。 一、数据类型在C/C++程序中常存在全局变量、函数内定义的静态变量以及局部变量,对于局部变量来说,其不存在线程安全问题,因此不在本文讨论的范围之内。全局变量和函数内定义的静态变量,是同一进程中各个线程都可以访问的共享变量,因此它们存在多线程读写问题。在一个线程中修改了变量中的内容,其他线程都能感知并且能读取已更改过的内容,这对数据交换来说是非常快捷的,但是由于多线程的存在,对于同一个变量可能存在两个或两个以上的线程同时修改变量所在的内存内容,同时又存在多个线程在变量在修改的时去读取该内存值,如果没有使用相应的同步机制来保护 ...
Android之性能监控框架
发表于2022-01-05
[TOC] 概述我们先说一下对象的创建过程。严格来说,对象的创建包括两个阶段,首先要分配内存空间,然后再进行初始化: 分配内存很好理解,就是在堆区、栈区或者全局数据区留出足够多的字节。这个时候的内存还比较“原始”,没有被“教化”,它所包含的数据一般是零值或者随机值,没有实际的意义。 初始化就是首次对内存赋值,让它的数据有意义。注意是首次赋值,再次赋值不叫初始化。初始化的时候还可以为对象分配其他的资源(打开文件、连接网络、动态分配内存等),或者提前进行一些计算(根据价格和数量计算出总价、根据长度和宽度计算出矩形的面积等)等。说白了,初始化就是调用构造函数。 很明显,这里所说的拷贝是在初始化阶段进行的,也就是用其它对象的数据来初始化新对象的内存。 当以拷贝的方式初始化一个对象时,会调用一个特殊的构造函数,就是拷贝构造函数(Copy Constructor)。 定义与使用以拷贝的方式初始化一个对象时,会调用一个特殊的构造函数,就是拷贝构造函数(Copy Constructor)。 我们先看拷贝构造函数的声明 12345/** * 拷贝构造函数(声明) * @param stu */ ...
1…303132…87
avatar
Frewen.Wang
在青麦地上跑着,雪和太阳的光芒
文章
864
标签
158
分类
0
关注我
公告
This is my Blog
最新文章
无题2023-12-22
无题2023-07-28
无题2023-07-27
基于Windows11安装Ubuntu双系统2023-07-20
无题2023-07-17
标签
系统源码 滤波算法 工具使用 云存储 卷积神经 Linux Android框架 STL函数 Activity pytorch NEON 编译脚本 go 渲染机制 OpenGL 编程工具 虚函数 RectNative JVM Linux命令 Kotlin基础 OpenMP AI const IDEA QNN C++ SELinux 目标检测 软件安装 threading 量化方法 四大组件 编译构建 SystemServer 开源项目 unique_ptr Java基础 系统安装 BroadcastReceiver
归档
  • 十二月 20231
  • 七月 20234
  • 六月 20231
  • 四月 20231
  • 三月 20232
  • 二月 202311
  • 一月 20232
  • 十二月 20221
网站资讯
文章数目 :
864
本站总字数 :
778.1k
本站访客数 :
本站总访问量 :
最后更新时间 :
©2020 - 2023 By Frewen.Wang
框架 Hexo|主题 Butterfly