• 死锁 必然


    问题:      写一个“必然”会出现死锁的一段代码,我面过很多人,他们写的都不是严格意义上的死锁,都被我挑出来很多刺。

    一:

    多线程的话可以用信号量 
    1 锁 A,2 锁 B 
    1 给 2 发信号,2 给 1 发信号 
    等到收到信号,1 锁 B,2 锁 A   (这里,要等到对方同意才可以锁。比如:1现在锁A,通过信号量,要等2同意才可以锁B。所以就不存在当1速度快,同时锁AB)

    因为各自没有取得锁前不会发出信号,因此收到信号就可以保证死锁 
    信号量可以使用操作系统的信号量,也可以使用原子变量简单实现 

    这不是一道考锁的题,而是一道考分布式系统事件排序的题 。

    非重入锁重入就是保证死锁

    二:

    用睡眠并不会必然导致死锁,只是以非常高的概率导致而已。 

    一个简单的方法是这样:线程 1 把自己的 handle 存在全局变量的 1 里,然后启动线程 2 并获得其 handle,然后等待这个 handle (等线程 2 结束);线程 2 的惟一工作是等待线程 1 的 handle。很容易证明,无论怎样调度,一定会进入死锁。 

    在没有单进程多线程概念的操作系统(如传统 UNIX ),你需要通过进程的等待完成类似任务。所以,看上面就行。

  • 相关阅读:
    luogu P3375 【模板】KMP字符串匹配
    leetcode[129]Sum Root to Leaf Numbers
    leetcode[130]Surrounded Regions
    leetcode[131]Palindrome Partitioning
    leetcode[132]Palindrome Partitioning II
    leetcode[133]Clone Graph
    leetcode[134]Gas Station
    leetcode[135]Candy
    leetcode[136]Single Number
    leetcode[137]Single Number II
  • 原文地址:https://www.cnblogs.com/fanguangdexiaoyuer/p/9082163.html
Copyright © 2020-2023  润新知