linux操作系统之信号量、互斥量在进程间的同步、文件锁

(1)信号量:进化版的互斥量

         多个线程间对某个对象的部分数据进行共享,使用互斥锁是没有办法实现的,只能将整个数据对象锁住。这样虽然达到了多线程操作数据共享的目的,却导致线程并发性下降。

         信号量:相对折中的一个处理方式,既能保证同步,数据不混乱,又能提高线程开发。

(2)信号量相关函数

          sem_t类型,用来定义信号量。虽然是结构体,使用的时候可以当做整数看待(类似文件描述符)。

           规定信号量不能小于0,信号量的初值,决定了占用信号量的线程的个数。

          头文件在<semaphore.h>

           1)初始化一个信号量:sem_init

                     int  sem_init(sem_t *sem,int pshared,unsigned int value);

                          参数1:信号量

                         参数2:取0表示线程间共享,取1表示进程间

                         参数3;信号量初值

           2)销毁一个信号量:sem_destroy

                   int sem_destroy(sem_t *sem);

          3)给信号量加锁:sem_wait(信号量初值--)

                   int sem_wait(sem_t *sem);

          4)给信号量解锁:sem_post(信号量初值++)

                   int sem_post(sem_t *sem);

          5)尝试对信号量加锁:sem_trywait

                   int sem_trywait(sem_t *sem);

          6)限时尝试给信号量加锁:sem_timedwait

                   int sem_timedwait(sem_t *sem,const struct timespec*abs_timeout);

(3)进程间同步

             进程间也可以通过互斥锁来达到同步,但必须在pthread_mutex_init初始胡之前,修改其属性为进程间共享。

              pthread_mutexattr_t mattr类型,用来定义mutex锁的属性,修改mutex锁属性函数。

                   1)初始化一个mutex属性对象:pthread_mutexattr_init

                                 int pthread_mutexattr_init(pthread_mutexattr_t *attr);

                   2)销毁一个mutex属性对象:pthread_mutexattr_destroy

                                   int pthread_mutexattr_destroy(pthread_mutexattr_t *attr); 

                   3)修改mutex属性

                                  int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr , int pshared); 

                            参数2:取值:

                                           线程锁:PTHREAD_PROCESS_PRIVATE(mutex默认属性,进程间私有);

                                           进程锁:PTHREAD_PROCESS_SHARED

(4)使用进程锁完成同步

                

                             

(5)文件锁

                借助fcntl来实现锁机制。操作文件的进程没有获得锁时 ,可以打开,但无法执行read/write操作

                         fcntl函数:获取和修改文件访问控制属性

                 int fcntl(int fd,int cmd,.../*arg*/);

                          参数2:F_SETLK:设置文件锁(trylock)           

                                        F_SETLKW 设置文件锁(wait)

                                        F_GETLK 获取文件锁

                         参数3:

                                    struct flock{

                                                   ..... 

                                                    short l_type;//锁的类型:F_RDLCK,F_WRLCK,F_UNLCK(解锁);

                                                    short l_whence;//偏移位置,SEEK_SET,SEEK_CUR,SEEK_END

                                                    off_t l_start;//起始偏移量

                                                    off_t l_len;  //加锁数据的长度,len=0,对整个文件加锁

                                                    pid_t l_pid;//持有该锁的进程ID:(F_GETLK only)

                                                  ...

                                       };

(6)进程间文件锁

     

(7)多线程中,能否使用文件锁?

                   多线程之间共享文件描述符,而给文件加锁,是通过修改文件描述符所指向的文件结构体中的成员变量来实现的。因此线程之间无法使用文件锁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382311.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux网络编程之网络应用设计模式、分层模型、通信过程

&#xff08;1&#xff09;网络协议 可以理解为规则&#xff0c;其中包含着数据传输和数据的解释。 典型的协议&#xff1a;传输层&#xff1a;tcp/udp协议&#xff0c;应用层&#xff1a;http/ftp协议&#xff0c;网络层&#xff1a;ip协议&#xff0c;网路接口&#xff1a;ar…

680. 验证回文字符串 Ⅱ golang

题目 验证回文字符串 Ⅱ 给定一个非空字符串 s&#xff0c;最多删除一个字符。判断是否能成为回文字符串。 示例 1: 输入: “aba” 输出: True 示例 2: 输入: “abca” 输出: True 解释: 你可以删除c字符。 注意: 字符串只包含从 a-z 的小写字母。字符串的最大长度是50000…

linux网络编程之通信协议格式

好文参考&#xff1a;《网路传输的三张表&#xff1a;MAC地址表&#xff0c;ARP缓存表和路由表》http://www.cnblogs.com/clovn/p/4911212.html &#xff08;1&#xff09;数据包封装 传输层及其一下的机制由内核决定&#xff0c;主要负责通讯的具体细节&#xff1b;应用层由用…

88. 合并两个有序数组 golang

88. 合并两个有序数组 给你两个有序整数数组 nums1 和 nums2&#xff0c;请你将 nums2 合并到 nums1 中&#xff0c;使 nums1 成为一个有序数组。 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。 你可以假设 nums1 有足够的空间&#xff08;空间大小大于或等于 m …

linux网络编程之Socket编程

&#xff08;1&#xff09;socket套接字 1&#xff09;在linux环境下&#xff0c;socket用于表示进程间网络通信的特殊文件类型&#xff0c;其本质是内核借助缓冲区形成的伪文件&#xff08;不占磁盘空间&#xff0c;除此之外还有二进制文件&#xff0c;管道&#xff0c;字符文…

Linux操作系统之简易实现server/client

1.首先将出错处理封装成函数&#xff0c;具体封装思想&#xff1a;是在底层函数的基础上将首字母大写&#xff08;方便在编程中查找函数文件的manpage,而不需要使用命令&#xff0c;直接用shiftk&#xff09;,然后调用底层库函数并考虑出错处理&#xff0c;具体函数如下&#x…

75. 颜色分类 golang

https://leetcode-cn.com/problems/sort-colors/solution/75-yan-se-fen-lei-golang-by-hodgekou/ Me func sortColors(nums []int) {sort.Ints(nums) }tips package mainimport ("fmt""sort" )//定义interface{},并实现sort.Interface接口的三个方法 ty…

linux网络编程之TCP三次握手和四次挥手

1.在TCP连接的过程中&#xff0c;有三个阶段&#xff0c;分别是建立连接&#xff0c;传递数据和断开连接&#xff0c;通讯时序图如下所示: 2.结合TCP数据报格式分析建立连接的三次握手 1&#xff09;首先客户端发送一个带有SYN标志的TCP报文给服务器端&#xff0c;询问服务器端…

451. 根据字符出现频率排序golang

官解 func frequencySort(s string) string {charMap : make(map[rune]int)arr : make([]string, len(s))for _,c : range s {charMap[c]}for k,v : range charMap {arr[v - 1] strings.Repeat(string(k), v)}r : ""for _,c : range arr {r c r}return r }自定义排…

linux网路编程之多进程并发服务器

1&#xff09;使用多进程并发服务器考虑的因素&#xff1a; &#xff08;1&#xff09;父进程描述最大文件描述符的个数&#xff08;父进程需要关闭accept返回的新文件描述符&#xff09; &#xff08;2&#xff09;系统内可创建进程的个数&#xff08;与内存大小相关&#xff…

69. x 的平方根 golang

Me https://leetcode-cn.com/problems/sqrtx/submissions/ func mySqrt(x int) int {return int(math.Sqrt(float64(x))) }

linux网路编程之多线程并发服务器

1&#xff09;在使用进程模型开发服务器过程中考虑以下问题 &#xff08;1&#xff09;调整进程内最大文件描述符上限 &#xff08;2&#xff09;线程如有共享&#xff0c;考虑线程同步 &#xff08;3&#xff09;客户端线程退出时&#xff0c;做退出处理&#xff08;线程分离&…

744. 寻找比目标字母大的最小字母 golang

官解 func nextGreatestLetter(letters []byte, target byte) byte {idx : 0for i : 0; i < len(letters); i {if letters[i] > target {idx ibreak}}return letters[idx] }Me 这个题答得很差劲&#xff0c;可能有点累 func nextGreatestLetter(letters []byte, target…

linux网路编程之TCP状态转换及端口复用

&#xff08;1&#xff09;TCP状态转换图 其中图中分为三种状态&#xff1a;实线代表的主动发起连接&#xff0c;虚线代表的被动发起连接&#xff0c;细实线代表的可以双向发起连接的状态。 主动发起连接方状态变化&#xff1a;1&#xff09;主动发起连接的一方发送SYN标志位&…

153. 寻找旋转排序数组中的最小值 golang

153. 寻找旋转排序数组中的最小值 golang Me func findMin(nums []int) int {if len(nums) < 2 {return nums[0]}i, j : 0, 1for j < len(nums) {if nums[i] < nums[j] {ij} else {return nums[j]}}return nums[0] }

linux网络编程之多路I/o转接服务器select

(1)多路IO转接服务器也叫做多任务IO服务器&#xff0c;其主要思想是不再由程序自己监听客户端连接&#xff0c;取而代之的是由内核替应用程序监视文件&#xff0c;具体实现模型如图所示&#xff1a; 当客户端请求和服务器连接时&#xff0c;内核接收到连接指令&#xff0c;告诉…

linux网络编程之多路I/O转接服务器poll函数

&#xff08;1&#xff09;poll函数 头文件&#xff1a;#include<poll.h> int poll(struct pollfd*fds, nfds_t nfds,int timeout); struct pollffd{ int fd;//文件描述符 short events;//监控的事件 short revents;//监控事件中满足条件返回的事情 }&#xff1…

540. 有序数组中的单一元素 golang

540. 有序数组中的单一元素 golang func singleNonDuplicate(nums []int) int {if len(nums) < 1 {return nums[0]}i : 0for i < len(nums) - 1 {if nums[i] ! nums[i1] {return nums[i]} else {i2}}return nums[i] }

C/C++构造及析构顺序及变量的生命周期

&#xff08;1&#xff09;变量的构造及析构顺序 1&#xff09;在全局范围内定义的对象&#xff08;即在所有函数之外定义的对象&#xff09;&#xff0c;它的构造函数在文件中的所有函数&#xff08;包括main函数&#xff09;执行之前调用。如果一个程序中有多个文件&#xff…

34. 在排序数组中查找元素的第一个和最后一个位置 golang

34. 在排序数组中查找元素的第一个和最后一个位置 https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/submissions/ Me func searchRange(nums []int, target int) []int {result : make([]int, 2)result[0] -1result[1] -1for …