linux操作系统之线程同步及互斥量

(1)线程同步

           1)线程同步:指一个线程发出某一个功能运行时,在运行还没有结束的时候,该调用不返回。同时其它线程为保证数据的一致性,不能调用该功能。

           2)多个控制流共同操作一个共享资源的时候,都需要同步

           3)数据混乱的原因:1》资源共享  2》调度随机   3》线程间缺乏必要的同步机制。

                      前两点无法避免,只能从第三点开始优化。

(2)互斥量mutex

         1)linux中提供一把互斥锁mutex(互斥量),每个线程都是提前对资源操作前都尝试先加锁,成功加锁才能操作,操作结束后解锁。

         2)同一个时刻,只能有一个线程持有该锁。

         3)当线程A多某个全局变量加锁访问时,B在访问时尝试加锁,失败后,B阻塞。C线程不加锁访问全局变量,可以访问,但是数据混乱,因此互斥锁又被成为“建议锁”(协同锁),没有强制限定

(3)互斥量及相关函数:

                pthread_mutex_t类型,一个结构体,使用时可看做整数。函数成功返回0,失败返回错误号。

              1)pthread_mutex_intit:初始化一个互斥锁(互斥量)    -->初值可看作1

                       int pthread_mutex_init(pthread_mutex_t*restrict mutex,const pthread_mutexattr_t*restrict attr);

                    参数1;传出参数,待初始化的互斥量。

                    参数2:看成互斥量属性,出入参数,通常传NULL,表示默认属性(线程间共享)

                    静态初始化: 使用宏初始化  pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;

                    动态初始化:使用函数初始化。

              2)pthread_mutex_destory:销毁一个互斥锁

                                 int  pthread_nutex_destory(pthread_mutex_t *mutex);

             3)pthread_mutex_lock:加锁

                           尝试加锁,加锁不成功,则阻塞。

                                 int  pthread_nutex_lock(pthread_mutex_t *mutex);

             4)pthread_mutex_unlock:解锁

                         唤醒阻塞所有线程。

                                 int  pthread_nutex_unlock(pthread_mutex_t *mutex);

             5)pthread_mutex_trylock:尝试加锁

                         加锁失败后返回错误号,不阻塞。

                                  int  pthread_nutex_trylock(pthread_mutex_t *mutex);

(4)加锁解锁测试:不同线程实现不同的打印任务

       

         

           结论:在访问共享资源时加锁,访问结束后解锁,锁的“粒度”越小越好

(5)死锁

             1)同一个线程试图多同一个互斥量加锁两次。

             2)线程1拥有A锁请求B锁;线程2拥有B锁请求A锁。

         

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

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

相关文章

golang实现聊天室(四)

golang实现聊天室(四) 服务端给已经建立连接的客户端发送消息 client1 func main() {var conn, err net.DialTimeout("tcp", "127.0.0.1:6888", 30*time.Second)if err ! nil {log.Fatal("conn error")}for {conn.Write…

linux操作系统之读写锁

(1)读写锁:只有一把锁,但是有两种状态(读,写) 1)读写锁的三种状态:读锁,写锁,不加锁 2)读写锁特性(12字)&…

golang实现聊天室(五)

golang实现聊天室(五) 完成服务端广播消息 server package mainimport ("fmt""log""math/rand""net" )type Client_list struct {list map[net.Conn]string }func main() {client_list : Client_list{make(map…

linux操作系统之条件变量

(1)条件变量 条件变量本身不是锁,但它可以造成线程阻塞,通常与互斥锁配合使用。 (2)条件锁相关函数 pthread_cond_t类型,用于定义条件变量 1)初始化一个条件变量:pthrea…

7. 整数反转 golang

官解 func reverse(x int) ( num int) {for x ! 0 {num num*10 x%10x x / 10}// 使用 math 包中定义好的最大最小值if num > math.MaxInt32 || num < math.MinInt32 {return 0}return }Me func reverse(x int) int {if x < 0 {return -1 * reverse_fun(-x)} else…

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

&#xff08;1&#xff09;信号量&#xff1a;进化版的互斥量 多个线程间对某个对象的部分数据进行共享&#xff0c;使用互斥锁是没有办法实现的&#xff0c;只能将整个数据对象锁住。这样虽然达到了多线程操作数据共享的目的&#xff0c;却导致线程并发性下降。 信号量&#x…

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标志位&…