进程同步和线程同步

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

大家好,又见面了,我是你们的朋友全栈君。

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

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

多线程同步方法

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

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

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

2)条件变量

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

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

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

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

4)信号量

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

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

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

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

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

读者可以参考UNIX网络编程卷2:进程通信

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159833.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 如何判断一段数据趋势,上升或 下降

    如何判断一段数据趋势,上升或 下降

    2021年11月22日
    39
  • goland最新激活码【中文破解版】

    (goland最新激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~S…

    2022年3月25日
    42
  • matlab读取mnist数据集(c语言从文件中读取数据)

    mnistdatabase(手写字符识别)的数据集下载地:http://yann.lecun.com/exdb/mnist/。准备数据MNIST是在机器学习领域中的一个经典问题。该问题解决的是把28×28像素的灰度手写数字图片识别为相应的数字,其中数字的范围从0到9.共有四个文件需要下载:train-images-idx3-ubyte.gz,训练集,共60,000幅(28*28)的图像数据…

    2022年4月17日
    51
  • stat 函数_stat函数返回值

    stat 函数_stat函数返回值stat函数讲解(转) 表头文件:   #include         #include定义函数:    intstat(constchar*file_name,structstat*buf);函数说明:    通过文件名filename获取文件信息,并保存在buf所指的结构体stat中返回值:    执行

    2022年8月21日
    9
  • Chain of Responsibility职责链[通俗易懂]

    Chain of Responsibility职责链[通俗易懂]职责链 Chain of Responsibility动机模式定义实例结构要点总结笔记动机在软件构建过程中,一个请求可能被多个对象处理.但是每个请求在运行时只能有一个请求者.如果显示指定.将必不可少地带来请求发送者与接收者地紧耦合如何使请求地发送者不需要指定具体地接收者?让请求地接收者自己在运行时决定来处理请求,从而使两者解耦模式定义使多个对象都有机会处理请求 从而避免请求地发送者和接收者之间地耦合关系.将这些对象形成一条链.并沿着这条链传递请求.直到有一个对象处理它为止实例#include&

    2022年8月9日
    2
  • java -jar 启动程序/设置classpath

    java -jar 启动程序/设置classpath前言在java-jar命令执行java程序时,制定classpath解决方案Java命令行提供了如何扩展bootStrap级别class的简单方法.-Xbootclasspath:完全取代基本核心的Javaclass搜索路径.不常用,否则要重新写所有Java核心class-Xbootclasspath/a:后缀。将classpath添加在核心cl…

    2022年6月1日
    198

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号