进程同步和线程同步

2024-08-28 04:08
文章标签 线程 同步 进程同步

本文主要是介绍进程同步和线程同步,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

         怎样同步多个线程或多个进程的活动。为允许在线程或进程间共享数据,同步是必需的。

         互斥锁和条件变量是同步的基本组成部分。互斥锁和条件变量出自POSIX.1线程标准,它们总是可用来同步一个进程内的各个线程的。如果一个互斥锁或条件变量存放在多个进程间共享的某个内存中,那么POSIX还允许它用于这些进程间的同步互斥锁、条件变量、读写锁、信号量均可用于进程、线程的同步

多线程同步方法

1)互斥量(互斥锁)

参考资料:互斥量:APUE第二版299页;  条件变量:第309页;  同步属性:318页。

         互斥锁是最基本的同步形式,用于保护临界区,确保同一时间只有一个线程或进程访问数据或执行其中的代码。互斥量(mutex)本质上是一把锁,访问共享资源前要对互斥量加锁,访问完后要释放锁。

        互斥量用于上锁,而条件变量用于等待

        允许多个进程将同一个内存区域映射到它们各自独立的地址空间,就像多线程一样共享数据,那么多个进程访问共享数据通常也需要同步。如果进程共享互斥量属性设置为PTHREAD_PROCESS_SHARED从多个进程共享的内存区域中分配的互斥量就可以用于这些进程的同步了。进程共享互斥量属性设为PTHREAD_PROCESS_PRIVATE时,允许pthread线程库提供更加有效的互斥量实现,这在多线程应用程序中是默认的情况。

       用于给存放在共享内存区中供多个进程使用的条件变量设置PTHREAD_PROCESS_SHARED属性的一组语句跟用于互斥锁的语句几乎相同,只需要将mutex替换为cond。

2)条件变量

         条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定条件发送。条件变量本身是由互斥量保护的。线程在改变条件状态前必须首先锁住互斥量,必须锁住互斥量以后才能计算条件。如果在规定的时间内条件满足就通知线程,否则生成一个代表出错码的返回变量。

        可以用于进程的同步,设置PTHREAD_PROCESS_SHARED属性。


3)读写锁(共享-独占锁)

        和互斥量类似,不过读写锁允许更高的并行性。互斥量要么是锁住状态要么是不加锁状态,而且一次仅允许一个线程对互斥量加锁。

        读写锁有三种状态:a. 读模式下加锁状态(所有试图以读模式对其进行加锁的线程都可以获得访问权,但如果试图以写模式加锁,必须阻塞直到所有线程释放读锁);b. 写模式下加锁状态(在这个锁被解锁之前,所有试图对这个锁加锁的线程都会被阻塞);c. 不加锁状态。

        可用于进程、线程之间的同步

4)信号量

信号量可用于线程或进程间同步

        信号量是一个计数器,用于多进程对共享数据对象的访问。若此信号量的值为正,则进程可以使用该资源;进程将信号量减1,表示它使用了一个资源单元。若此信号量的值为0,则进程进入休眠状态,直至信号量位于0。若一个进程不再使用由一个信号量控制的共享资源时,该信号量值增1。如果有进程正在休眠等待此信号量,则唤醒它们。

POSIX信号量:

参考:UNP卷2第10章

        POSIX信号量可以是有名的,也可以是基于内存的。有名信号量总是能够在不同进程间共享,基于内存的信号量则必须在创建时指定成是否在进程间共享。这两类信号量的持续性也有差别:有名信号量至少是随内核持续的,基于内存的信号量则是具有随进程持续的。

System V信号量

如同进程一样,线程也可以通过信号量来实现通信,虽然是轻量级的。信号量函数的名字都以"sem_"打头。线程使用的基本信号量函数有四个。

  1. 信号量初始化。
    int sem_init (sem_t *sem , int pshared, unsigned int value);
    这是对由sem指定的信号量进行初始化,设置好它的共享选项(linux 只支持为0,即表示它是当前进程的局部信号量),然后给它一个初始值VALUE。
  2. 等待信号量。给信号量减1,然后等待直到信号量的值大于0。
    int sem_wait(sem_t *sem);
  3. 释放信号量。信号量值加1。并通知其他等待线程。
    int sem_post(sem_t *sem);
  4. 销毁信号量。我们用完信号量后都它进行清理。归还占有的一切资源。
    int sem_destroy(sem_t *sem);

进程间同步方法

上述提到的互斥量、条件变量、读写锁、信号量都可用于进程间同步

互斥量

条件变量

读写锁

信号量

记录锁

        Linux内核没有文件内的记录这一概念。任何关于记录的接收都是由读写文件的应用来进行的。然而linux内核提供的上锁特性却用记录上锁(record locking)这一术语描述。不过应用会指定文件中待上锁或解锁部分的字节范围,因为记录锁锁定的只是文件中的一个区域。

       记录锁是读写锁的一种拓展,可用于亲缘或非亲缘关系的进程间共享某个文件的读写。被锁住的文件通过其描述符访问,执行上锁操作的函数是fcntl。这类锁通常维护在内核中,其属主是由属主的进程ID来标识的。这意味着这些锁用于不同进程间的上锁不适用于同一进程不同线程间上锁

      使用fcntl记录上锁时,等待着的读出者优先还是等待着的写入者优先没有保证;如果这对于某个应用很重要,就需要开发测试程序(UNP卷2,9.6节),或者给该应用提供满足所需优先关系的专用读写锁实现。

这篇关于进程同步和线程同步的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1113679

相关文章

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

SpringBoot实现虚拟线程的方案

《SpringBoot实现虚拟线程的方案》Java19引入虚拟线程,本文就来介绍一下SpringBoot实现虚拟线程的方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录什么是虚拟线程虚拟线程和普通线程的区别SpringBoot使用虚拟线程配置@Async性能对比H

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

Java中的xxl-job调度器线程池工作机制

《Java中的xxl-job调度器线程池工作机制》xxl-job通过快慢线程池分离短时与长时任务,动态降级超时任务至慢池,结合异步触发和资源隔离机制,提升高频调度的性能与稳定性,支撑高并发场景下的可靠... 目录⚙️ 一、调度器线程池的核心设计 二、线程池的工作流程 三、线程池配置参数与优化 四、总结:线程

WinForm跨线程访问UI及UI卡死的解决方案

《WinForm跨线程访问UI及UI卡死的解决方案》在WinForm开发过程中,跨线程访问UI控件和界面卡死是常见的技术难题,由于Windows窗体应用程序的UI控件默认只能在主线程(UI线程)上操作... 目录前言正文案例1:直接线程操作(无UI访问)案例2:BeginInvoke访问UI(错误用法)案例

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected