首页 > 编程知识 正文

多线程并行处理,c语言多线程编程

时间:2023-05-04 13:22:04 阅读:140456 作者:3047

1、概念

(1)线程

执行处理器调度的基本单位。 程序执行中的最小单元由线程ID、程序计数器、寄存器集合、堆栈构成。

)2)过程

资源分配的基本单位也可以用作计划执行的单位。 进程是指程序在数据集上动态执行的进程。 过程通常由程序、数据集和过程控制块三部分组成。 我们编写的程序用于说明流程执行什么功能以及如何执行。 数据集是运行程序所需的资源。 进程控制块记录进程的外部特性,描述进程运行的变化过程,系统可以利用它来控制和管理进程,这是系统感知进程存在的唯一标志。

2、差异

)一个线程只属于一个进程。 此外,一个进程可以有多个线程,但至少有一个线程。

)资源被分配给进程,并且同一进程的所有线程共享该进程的所有资源。

)3) CPU被分配给线程。 也就是说,实际在CPU上运行的是线程。

对比维度

多进程

多线程

总结

数据共享、同步

数据共享很复杂,需要IPC的数据是分离的,同步很简单

由于共享工艺处理数据,因此数据共享很简单,但同步会变得复杂

各有优势

存储器、CPU

占用内存多,切换复杂,CPU使用率低

占用内存少,切换简单,CPU使用率高

线程优势

放弃、切换

废弃、切换复杂、低速

销毁、切换简单、高速

线程优势

编程、调试

编程简单,调试简单

编程复杂,调试复杂

过程占优势

可靠性

没有进程之间的影响

当线程挂起时,整个过程将挂起

过程占优势

方差

如果一台支持多核、多机分布式的机器不够,则扩展到多台机器很容易

支持多核分布式

过程占优势

1)需要频繁创建销毁的优先用线程

理由请看上面的对比。

这个原则最常见的应用是Web服务器。 连接并建立线程,断开连接后销毁该线程。 使用流程会增加创建和销毁的成本

2)需要进行大量计算的优先使用线程

大量的计算,当然会使用很多CPU,切换变得频繁。 在这种情况下,线程是最佳的。

这个原则最常见的是图像处理、算法处理。

3)强相关的处理用线程,弱相关的处理用进程

什么是强相关、弱相关? 虽然理论上很难定义,但是举个简单的例子就知道了。

典型的Server需要完成消息收发、消息处理这些任务。 “收发消息”和“处理消息”是相关性较弱的任务,但“处理消息”中可分为“消息解码”、“业务处理”,这两个任务的相关性相对较强。 因此,“消息收发”和“消息处理”可以按进程设计,“消息解码”和“业务处理”可以按线程设计。

当然,这种划分方式不是一定的,也可以根据实际情况进行调整。

4)可能要扩展到多机分布的用进程,多核分布的用线程

理由请看上面的比较。

5)都满足需求的情况下,用你最熟悉、最拿手的方式

对于应该如何取舍“数据共享、同步”、“编程、调试”、“可靠性”这些维度的所谓“复杂、简单”,只能说没有明确的选择方法。 但是,让我告诉你一个选择原则。 如果多进程和多线程都能满足要求,请选择你最熟悉和擅长的东西。

3、创建多线程

C 11新标准多线程支持库

thread :提供用于创建和管理线程的函数或类接口;

mutex :为线程提供独占算法以实现独占资源访问,并确保多个线程同时访问共享资源。

condition_variable :允许一定量的线程等待另一个线程启动,然后继续执行。

future :提供了用于获取异步任务或在另一个线程上调用的函数的返回值并捕获抛出异常的工具。

atomic :提供了精细的原子操作组件,这些组件无法由处理器拆分,因此可以同时编程而无需锁定。

4、多线程通信方式:

(1)排他锁

最大;

lock_guard (用构造函数锁定,用析构函数解除锁定) )。

unique_lock自动锁定,解锁

atomic基本型的原子操作

)2)条件变量condition_variable

关于互斥锁和条件更改

量:
互斥量可以保护共享数据的修改,如果线程正在等待共享数据的某个条件出现,仅用互斥量的话就需要反复对互斥对象锁定解锁,以检查值的变化,这样将频繁查询的效率非常低。
条件变量可以让等待共享数据条件的线程进入休眠,并在条件达成时唤醒等待线程,提供一种更高效的线程同步方式。条件变量一般和互斥锁同时使用,提供一种更高效的线程同步方式。
(3)信号量
(4)读写锁shared_lock。
 

5、进程间的通信方式

(1). 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
(2). 命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
(3) 消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
(4). 共享存储SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
(5). 信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
(6)套接字Socket:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
(7) 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

6、c++ 11 线程创建方式

#include<thread>,通过std::thread 创建。

代码可参考:1、https://blog.csdn.net/ouyangfushu/article/details/80199140?ops_request_misc=&request_id=&biz_id=102&utm_term=c++%20%E5%A4%9A%E7%BA%BF%E7%A8%8B&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-4-80199140.first_rank_v2_pc_rank_v29&spm=1018.2226.3001.4187

2、https://www.cnblogs.com/wangguchangqing/p/6134635.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。