linux网络编程----->线程死锁

简介:

   开发使用多线程过程中, 不可避免的会出现多个线程同时操作同一块共享资源, 当操作全部为读时, 不会出现未知结果, 一旦当某个线程操作中有写操作时, 就会出现数据不同步的事件. 

    而出现数据混乱的原因:

    • 资源共享(独享资源则不会)

    • 调试随机(对数据的访问会出现竞争)

    • 线程间缺少必要的同步机制   

    以上三点, 前两点不能被改变. 欲提高效率, 传递数据, 资源必须共享. 只要资源共享, 就一定会出现线程间资源竞争, 只要存在竞争关系, 数据就会出现混乱.

    所以只能从第三点着手, 使多个线程在访问共享资源的时候, 出现互斥.


线程同步:

    指在一定的时间里只允许某一个进程访问某个资源,而在此时间内,不允许其它线程对该资源进行操作.

    

    在使用锁的时候, 以下会出现死锁状态.

    • 线程试图对一把锁进行加锁两次

    • 哲学家就餐[N个哲学家, N支筷子, 哲学家同时对一个方向取筷子, 取到后需要拿另一方面的场子才可以就餐]  


    线程试图对一把锁进行加锁两次:

    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
/*
  *   模拟一个线程对一把锁进行加锁两次
  *   author sea time 2016/06/15
  */
 
//创建一把互斥锁, 并进行静态初始化
pthread_mutex_t mutex =  PTHREAD_MUTEX_INITIALIZER;
 
//线程函数
void * thread_handler( void * args){
     //第一次获取锁成功
     pthread_mutex_lock(&mutex);
     //成功获取打印
     printf ( "get mutex 1 successfully!\n" );
     //第二次获取同一把锁
     pthread_mutex_lock(&mutex);
     printf ( "get mutex 2 successfully!\n" );
     pthread_mutex_unlock(&mutex);
     pthread_mutex_unlock(&mutex);
     
     pthread_exit(NULL);
}
 
int  main( int  argc,  char * argv[]){
     pthread_t tid;
     pthread_create(&tid, NULL, thread_handler, NULL);
 
     //等待线程结束
     pthread_join(tid, NULL);
 
     //释放互斥锁
     pthread_mutex_destroy(&mutex);
     return  0;
}

    运行结果:

    wKioL1dhcbXCI0_0AAAt9kDZn90862.png-wh_50

    结果如预期所至, 一直阻塞在那获取锁.


    哲学家就餐[N个哲学家, N支筷子, 哲学家同时对一个方向取筷子, 取到后需要拿另一方面的场子才可以就餐]:


    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
/*
  * 模拟哲学家用餐模型
  *  author sea time 2016/0615
  */
  //用五把锁模拟五支筷子
pthread_mutex_t mutex[5];
 
void * thread_handler( void * args){
     //获取当前位数
     long  i = ( long )args;
     int  left, right;
     //当是最后一个哲学家
     if ( sizeof (mutex)/ sizeof (*mutex) == i + 1){
         left = i;
         right = 0;
     }
     else {
         left = i;
         right = i + 1;
     }
     //获取左边的筷子
     pthread_mutex_lock(&mutex[left]);
     //等待100毫秒, 让其它线程都拿到自己右边的筷子
     usleep(100);
     //获取右边的筷子
     pthread_mutex_lock(&mutex[right]);
     sleep(2);
     printf ( "%ld 吃完了....!\n" , i);
     //解锁
     pthread_mutex_unlock(&mutex[right]);
     //解锁
     pthread_mutex_unlock(&mutex[left]);
 
     pthread_exit(NULL);
}
int  main( int  argc,  char * argv[]){
     long  i = 0;
     int  ret = 0;
     pthread_t tid[5];
     
 
     //初始化五把锁
     for (i = 0; i <  sizeof (mutex)/ sizeof (*mutex); i++){
         pthread_mutex_init(mutex+i, NULL);
     }
 
     //创建五个线程
     for (i = 0; i <  sizeof (tid)/ sizeof (*tid); i++){
         pthread_create(tid+i, NULL, thread_handler, ( void *)i);
     }
 
     //等待线程
     for (i = 0; i <  sizeof (tid) /  sizeof (*tid); i++){
         pthread_join(tid[i], NULL);
     }
     
     //释放五把锁
     for (i = 0; i <  sizeof (mutex)/ sizeof (*mutex); i++){
         pthread_mutex_destroy(mutex+i);
     }
     return  ret;
}

    运行结果: 会一直阻塞


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








      本文转自asd1123509133 51CTO博客,原文链接:http://blog.51cto.com/lisea/1789733,如需转载请自行联系原作者


相关文章
|
12天前
|
安全 Linux 网络安全
Web安全-Linux网络协议
Web安全-Linux网络协议
37 4
|
12天前
|
机器学习/深度学习 安全 网络协议
Web安全-Linux网络命令
Web安全-Linux网络命令
14 1
|
17天前
|
网络协议 C语言
C语言 网络编程(十四)并发的TCP服务端-以线程完成功能
这段代码实现了一个基于TCP协议的多线程服务器和客户端程序,服务器端通过为每个客户端创建独立的线程来处理并发请求,解决了粘包问题并支持不定长数据传输。服务器监听在IP地址`172.17.140.183`的`8080`端口上,接收客户端发来的数据,并将接收到的消息添加“-回传”后返回给客户端。客户端则可以循环输入并发送数据,同时接收服务器回传的信息。当输入“exit”时,客户端会结束与服务器的通信并关闭连接。
|
17天前
|
C语言
C语言 网络编程(九)并发的UDP服务端 以线程完成功能
这是一个基于UDP协议的客户端和服务端程序,其中服务端采用多线程并发处理客户端请求。客户端通过UDP向服务端发送登录请求,并根据登录结果与服务端的新子线程进行后续交互。服务端在主线程中接收客户端请求并创建新线程处理登录验证及后续通信,子线程创建新的套接字并与客户端进行数据交换。该程序展示了如何利用线程和UDP实现简单的并发服务器架构。
|
29天前
|
存储 Linux Shell
在Linux中,如何使用脚本,实现判断 192.168.1.0/24 网络里,当前在线的 IP 有哪些?能ping 通则 认为在线。
在Linux中,如何使用脚本,实现判断 192.168.1.0/24 网络里,当前在线的 IP 有哪些?能ping 通则 认为在线。
|
29天前
|
监控 网络协议 Linux
在Linux中,如何实时抓取并显示当前系统中tcp 80 端口的网络数据信息?
在Linux中,如何实时抓取并显示当前系统中tcp 80 端口的网络数据信息?
|
29天前
|
监控 安全 Linux
在Linux中,如何进行网络资源的优先级管理?
在Linux中,如何进行网络资源的优先级管理?
|
8天前
|
网络协议 Linux
Linux 网络配置
了解基本命令与权限后,如何让Linux系统联网?可通过编辑`/etc/sysconfig/network-scripts/`下的`ifcfg-ethX`文件配置网卡,其中`ethX`代表第X块网卡。对于DHCP自动获取或静态IP,需设置`BOOTPROTO`参数,并指定IP、子网掩码和网关等。配置完成后,运行`/etc/init.d/network restart`重启网络。DNS可在`/etc/resolv.conf`中设置,添加`nameserver`行即可,无需重启网卡。配置好后,可用`ifconfig`查看IP信息,并通过远程工具如SecureCRT连接服务器。
21 0
|
15天前
|
域名解析 负载均衡 网络协议
Linux网络接口配置不当所带来的影响
总而言之,Linux网络接口的恰当配置是保证网络稳定性、性能和安全性的基础。通过遵循最佳实践和定期维护,可以最大程度地减少配置错误带来的负面影响。
46 0
|
22天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享安卓与iOS开发中的线程管理比较
【8月更文挑战第30天】本文将探讨网络安全与信息安全的重要性,并分享关于网络安全漏洞、加密技术和安全意识的知识。我们将了解常见的网络攻击类型和防御策略,以及如何通过加密技术和提高安全意识来保护个人和组织的信息安全。