0


linux高级命令之死锁

死锁

学习目标

  • 能够知道产生死锁的原因

1. 死锁的概念

死锁: 一直等待对方释放锁的情景就是死锁

为了更好的理解死锁,来看一个现实生活的效果图:

说明:

现实社会中,男女双方一直等待对方先道歉的这种行为就好比是死锁。

死锁的结果

  • 会造成应用程序的停止响应,不能再处理其它任务了。

2. 死锁示例

需求:

根据下标在列表中取值, 保证同一时刻只能有一个线程去取值

import threading
import time

# 创建互斥锁
lock = threading.Lock()

# 根据下标去取值, 保证同一时刻只能有一个线程去取值defget_value(index):# 上锁
    lock.acquire()
    print(threading.current_thread())
    my_list = [3,6,8,1]
    # 判断下标释放越界if index >= len(my_list):
        print("下标越界:", index)
        return
    value = my_list[index]
    print(value)
    time.sleep(0.2)
    # 释放锁
    lock.release()

if __name__ == '__main__':
    # 模拟大量线程去执行取值操作for i in range(30):
        sub_thread = threading.Thread(target=get_value, args=(i,))
        sub_thread.start()

3. 避免死锁

  • 在合适的地方释放锁
import threading
import time

# 创建互斥锁
lock = threading.Lock()

# 根据下标去取值, 保证同一时刻只能有一个线程去取值defget_value(index):# 上锁
    lock.acquire()
    print(threading.current_thread())
    my_list = [3,6,8,1]
    if index >= len(my_list):
        print("下标越界:", index)
        # 当下标越界需要释放锁,让后面的线程还可以取值
        lock.release()
        return
    value = my_list[index]
    print(value)
    time.sleep(0.2)
    # 释放锁
    lock.release()

if __name__ == '__main__':
    # 模拟大量线程去执行取值操作for i in range(30):
        sub_thread = threading.Thread(target=get_value, args=(i,))
        sub_thread.start()

4. 小结

  • 使用互斥锁的时候需要注意死锁的问题,要在合适的地方注意释放锁。

  • 死锁一旦产生就会造成应用程序的停止响应,应用程序无法再继续往下执行了。

进程和线程的对比

学习目标

  • 能够知道进程和线程的关系

1. 进程和线程的对比的三个方向

  1. 关系对比

  2. 区别对比

  3. 优缺点对比

2. 关系对比

  1. 线程是依附在进程里面的,没有进程就没有线程。

  2. 一个进程默认提供一条线程,进程可以创建多个线程。

2. 区别对比

  1. 进程之间不共享全局变量

  2. 线程之间共享全局变量,但是要注意资源竞争的问题,解决办法: 互斥锁或者线程同步

  3. 创建进程的资源开销要比创建线程的资源开销要大

  4. 进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位

  5. 线程不能够独立执行,必须依存在进程中

  6. 多进程开发比单进程多线程开发稳定性要强

3. 优缺点对比

  • 进程优缺点:

  • 优点:可以用多核

  • 缺点:资源开销大

  • 线程优缺点:

  • 优点:资源开销小

  • 缺点:不能使用多核

4. 小结

  • 进程和线程都是完成多任务的一种方式

  • 多进程要比多线程消耗的资源多,但是多进程开发比单进程多线程开发稳定性要强,某个进程挂掉不会影响其它进程。

  • 多进程可以使用cpu的多核运行,多线程可以共享全局变量。

  • 线程不能单独执行必须依附在进程里面

标签: linux 运维 服务器

本文转载自: https://blog.csdn.net/qq_41810183/article/details/129117442
版权归原作者 lucky-zhao 所有, 如有侵权,请联系我们删除。

“linux高级命令之死锁”的评论:

还没有评论