C/C++多线程并发并行
文章平均质量分 69
介绍讲解POSIX Thread和C/C++多线程编程和项目经验, 交流沟通.
Peter(阿斯拉达)
关注系统界面开发技术,安全,语言特性,网络,图形,AI,硬件,并发,研发流程管理.
展开
-
[并发并行]_[中级]_[C++实现synchronized方式的对象锁2.0]
1. 在前面的文章说过《C++实现synchronized方式的对象锁》可以实现`Java`的`synchronized`易用特性。这个第一版的例子并没有说明如何删除`pthread_mutex_t`对象,随着加锁的对象增加会出现内存泄漏的情况,怎么解决?原创 2024-01-05 23:35:19 · 503 阅读 · 0 评论 -
[并发并行]_[C/C++]_[C++标准库里的线程安全问题]
场景1.写普通的程序时, 经常会使用cout来做输出, 每个进程只有一个控制台, 如果多线程调用cout时会出状况吗?2.之所以研究cout会不会在并发下调用有问题, 是因为曾经有一个bug的崩溃点正好在cout处.3.参考vc++的说明, iostream库的对象在并发write时是不会有问题的, 以下是对vc++针对stl库的线程安全的说明.说明1.以下线程安全的规则适用于标准C++库(除了sh原创 2017-01-14 15:55:47 · 4688 阅读 · 0 评论 -
[并发并行]_[Windows]_[指定程序执行的CPU]
场景在编写音视频转换或者需要CPU密集型运算的应用时,一般会开启多线程进行并发执行,而多线程往往就会使用多个CPU. 这时候如果把CPU都用完了,CPU 使用率达到很高的话,就会影响电脑桌面的其他任务的执行,比如点击界面的软件,鼠标移动都会卡.这时候如果只使用一半的CPU的话应该就不会影响用户的正常操作了.Win32 函数 SetProcessAffinityMask 就可以解决这个问题.参原创 2016-04-26 14:19:42 · 4375 阅读 · 0 评论 -
[多线程并发并行]_[C/C++11]_[如何取消线程-停止线程]
场景在开发多线程程序时,经常由于需要重新执行任务从而取消(停止)工作线程。C++11目前并没有很好的取消线程执行的机制。那么我们应该如何实现取消线程呢?说明C++11使用<future>库进行线程间数据通讯,也可以利用它来进行控制线程停止。但是没有pthread那么强大,pthread有取消点函数,线程执行到取消点函数就会判断如何线程状态设置为取消,那么就会调用预先设定的线程清理函数清理资源,而取消点之后的代码块不会执行。而C++11并没有取消点的设计。只有在工作线程里判断某个值如原创 2020-07-19 17:19:34 · 4118 阅读 · 0 评论 -
[多线程并发并行]_[C/C++11]_[多线程访问修改集合vector会冲突的两个解决方案]
1. 在开发`C/C++`多线程程序时,`STL`集合类是我们经常用到的类,比如`vector`. 而`C/C++`的这些集合类并没有同步版本,所以在多线程访问时,如果某个线程正在修改集合类`A`, 而其他线程正在访问`A`,那么会造成数据冲突,导致程序抛出异常。这里说的访问`A`,意思是调用`A`的任何方法。难道我们需要在用到`A`的地方对`A`进行加锁? 麻烦不止,而且很容易造成性能下降。原创 2020-06-21 15:13:15 · 3154 阅读 · 0 评论 -
[并发并行]_[线程池]_[Programming With POSIX Threads的线程池实现分析1]
场景1.C++标准库没有提供线程池操作, 连Win32都没有集成线程池, 相比之下macOS完善多了, 至少有operations. 多线程在执行多任务时有很大优势, 比如同时管理多个设备, 多个socket连接等.2.第3方库也有很多, 最常见的是boost的线程, 可是boost编译的成本也很高, 打包也很大, 一般不考虑.说明1.Programming With POSIX Threads 的原创 2017-07-19 17:03:05 · 1514 阅读 · 0 评论 -
[并发并行]_[中级]_[实现Pthread线程并发读写锁rwlock]
场景1.所有STL的类实例都是并发读线程安全的,除了shared_ptr,iostream 可允许并发写.在设计对象结构时,往往会用到std::vector,std::map 作为容器存储. 并在多线程程序里并发读写. 当然如果牺牲性能只在一个特定线程里读/写当然也可以,只是性能会降低,而且会带来异步执行的烦恼.2.当然如果多线程可以读写,那么对这个共享对象是需要加锁的, 而多线程的坏处是你并不知道原创 2017-03-31 15:57:17 · 1591 阅读 · 0 评论 -
[并发并行]_[任务停止]_[使用Pthread的线程本地存储来停止任务执行]
场景1.多线程应用里, 线程基本上都是出自线程池, 那么基本不能使用pthread_cancel这类API, 因为它会终止线程运行, 线程终止后不能再次循环使用, 这对性能要求高的软件时基本是不会用pthread_cancel来停止逻辑运行的.2.自行设计的可预测伪线程停止,其实就是停止执行当前的业务逻辑,并不是终止线程, 让线程回归线程池. 目前我发现的方案基本上离不开对状态变量的判断. (比较忙原创 2017-02-28 14:20:26 · 1104 阅读 · 0 评论 -
[并发并行]_[线程取消]_[Pthread的线程取消特性]
场景1.大多数情况下我们都从线程池获取工作线程执行任务,线程池的线程缺点就是不能使用线程的取消特性. 因为线程取消(停止)就是终止线程, 终止后的线程不能再次重用.2.在有线程池的情况下, pthread_cancel 目前发现只能用在程序退出时终止所有线程. 至于线程池的取消操作, 有很多种方法, 比如使用Thread-specific data.(最终还是要判断某个变量)3.如果没有线程池, 那原创 2017-02-28 11:32:42 · 1292 阅读 · 0 评论 -
[并发并行]_[pthread]_[对工作线程进行简单控制-暂停-继续-停止]
1.使用命令行对线程简单控制。界面和Win32版本的:http://blog.csdn.net/xianglitian/article/details/6729851场景:1.在开发界面程序时,为了不让界面程序挂起,会新建一个工作线程来处理逻辑,主线程就能持续和用户交互。2.pthread优点:跨平台。耗时:3h文件1: test原创 2013-01-23 14:09:52 · 3906 阅读 · 0 评论 -
[并发并行]_[pthread]_[线程池的简单设计与实现]
1.当需要下载网络文件时,无限制的new 一个新线程来下载时,必然会造成创建销毁线程时的资源消耗。还有就是处理一些网络通信时,如果无限制的开线程,势必会造成系统资源严重浪费。这时候线程池能很好的解决线程复用的问题。2.这里花了5小时做了一个简单的线程池实现,目的是给童鞋做个参考,满足特定任务的线程池也不是非常难的技术。3.示例程序开了一个容量是5个线程的线程池下载文件,启动了10次下载任务原创 2013-03-13 23:07:07 · 4735 阅读 · 0 评论 -
[并发并行]_[pthread]_[使用线程池并发复制文件]
场景:1.在复制多个文件时线程池也有用武之地,多线程复制文件是受io影响的,在设置一定的缓存时有一定效果。2.或者在Linux下有一定效果,但是在windows上使用fopen效果不太明显。有知道的高手请指教。3.参考qt并发复制文件,并沿用之前的线程池实现。4.商用的话建议可以用boost的 http://sourceforge.net/projects/threadpool/?原创 2013-05-07 17:21:01 · 1981 阅读 · 0 评论 -
[并发并行]_[线程同步]_[pthread和win32的临界区(Critical Section)比较]
场景:1. 在多线程程序里,临界区是最常见的同步访问共享资源的最简单的解决方案. 2. pthread是跨平台的线程模型,那么它和本地的线程模型的临界区编程有什么区别呢?原创 2015-02-27 17:32:47 · 2715 阅读 · 0 评论 -
[并发并行]_[线程同步]_[Windows用户态下的原子访问的互锁函数]
场景:1. 多线程编程时,有时候需要统计某个变量或对象的创建个数或者是根据某个变量值来判断是否需要继续执行下去,这时候互锁函数是比较高效的方案之一了。原创 2015-02-28 10:39:12 · 1765 阅读 · 0 评论 -
[并发并行]_[C/C++]_[使用线程本地存储Thread Local Storage(TLS)-win32线程和pthread线程比较]
场景:1. 需要统计某个线程的对象上创建的个数.2. 当创建的堆空间需要根据线程需要创建和结束时销毁时.3. 因为范围是线程只能看到自己的存储数据,所以不需要临界区或互斥量来维护自己的堆内存. 加入如果用全局std::map实现,那么必须在put和get时加锁,这是很损耗资源的.4. 可以用在维护一个连接,比如socket,database连接.原创 2015-02-28 23:18:22 · 4224 阅读 · 0 评论 -
[并发并行]_[C/C++]_[使用线程本地存储Thread Local Storage(TLS)调用复制文件接口的案例]
使用场景:1. 在复制文件时,一般都是一个线程调用一个接口复制文件,这时候需要缓存数据,如果每个文件都需要创建独立的缓存,那么内存碎片是很大的.如果创建一个static的内存区,当多线程调用同一个接口时,多个线程同时使用同一个static缓存会造成数据污染.最好的办法是这个缓存只对这个线程可见,当线程创建时创建缓存区,当线程结束时销毁缓存区.原创 2015-11-08 03:56:56 · 3148 阅读 · 0 评论 -
[并发并行]_[线程同步]_[C/C++实现单例模式分析]
场景:1. 很多情况下,我们需要实现一个类的单例模式,比如XXManager, 于是提供一个GetInstance()的函数. Java可以使用双锁来处理.C/C++也类似.2. 提供GetInstance()的一个必要条件是必须是线程安全的, 否则会出现创建多个实例的情况. 更简单的做法是在程序初始化时(Main线程)调用一个CreateInstance()函数来创建, 但是如果这种单例对象多了的话, 这来CreateInstance调用也会增多, 如果忘记了调用还会直接崩溃.原创 2015-11-12 14:14:10 · 3212 阅读 · 0 评论 -
[并发并行]_[Object-C]_[使用NSMutableArray等非线程安全集合类的注意事项]
场景:1. 开发Mac,iOS程序时,一般都会涉及到多线程开发, 比如工作线程在更新数据模型, 主线程根据数据模型来显示界面. 比如最常用的NSMutableArray, NSMutableDictionary等, 这类集合在调用读写方法时并不是线程安全的,也就是说会出现数据不一致性和崩溃现象.2. 解决办法就是使用@syncronized()关键字, 有点类似Java.原创 2015-11-12 15:40:46 · 4945 阅读 · 0 评论 -
[并发并行]_[初级]_[C++实现synchronized方式的对象锁]
场景:1. 多线程程序, 数据如果在多线程间共享时, 比如数组, 基本都是需要加锁来保证安全,正确性. std库的数据结构类,如std::vector不是线程安全的, 所以读写时必须上锁.2. objc,Java可以用sychronized来对对象加锁, 使能安全访问对象, 如果不加锁, 大多数情况下程序会崩溃.3. 问题是无论是用 pthread_mutex_t 还是用CriticalSection, 都需要额外创建一个mutex和section来进行加锁,这样会增加很多全局变量(需要在不同的源代原创 2015-12-05 00:54:18 · 4556 阅读 · 1 评论 -
[并发并行]_[线程模型]_[Pthread线程使用模型之一管道Pipeline]
场景1.经常在Windows, MacOSX 开发C多线程程序的时候, 经常需要和线程打交道, 如果开发人员的数量不多时, 同时掌握Win32和pthread线程 并不是容易的事情, 而且使用Win32线程并不能写出跨平台的实现. 所以在成本的制约下选用pthread作为跨平台线程库的首选. 有足够人力的公司可以再封装一层对Win32和本地pthread的调用. 比如 chrome.2.线程原创 2016-10-22 00:04:13 · 2255 阅读 · 0 评论 -
[并发并行]_[线程模型]_[Pthread线程使用模型之二 工作组work crew]
Pthread线程使用模型之二工作组(Work crew)场景1.一些耗时的任务,比如分析多个类型的数据, 是独立的任务, 并不像 pipeline那样有序的依赖关系, 这时候pipeline就显得不合适了,因为它不能同时处理这些任务. 当然有些任务A可能依赖任务B的输出, 这可能就嵌套了pipeline模型了.2.复杂的计算,可以分开独立的逻辑单独处理, 之后再合并结果. 说明1.在工作组里, 数原创 2016-11-24 11:37:45 · 1326 阅读 · 0 评论 -
[并发并行]_[线程模型]_[Pthread线程使用模型之三 客户端/服务端模型(Client/Server]
Pthread线程使用模型之三 客户端/服务端模型(Client/Server)场景1.在客户端/服务端模型时,客户端向服务端请求一些数据集的操作. 服务端执行执行操作独立的(多进程或跨网络)– 客户端可以等待服务端响应再做其他任务或者做一些并行的操作,在一段时间后被通知时再去查询结果. 虽然客户端等待服务端是最简单的方式, 但是这种情况极少使用, 因为它不具备速度和性能优势, 同步的只适合获取一些原创 2016-12-25 15:55:24 · 1401 阅读 · 0 评论