Good example of livelock?

后端 未结 11 1746
后悔当初
后悔当初 2021-01-29 18:44

I understand what livelock is, but I was wondering if anyone had a good code-based example of it? And by code-based, I do not mean \"two people trying to get p

11条回答
  •  粉色の甜心
    2021-01-29 19:07

    Flippant comments aside, one example which is known to come up is in code which tries to detect and handle deadlock situations. If two threads detect a deadlock, and try to "step aside" for each other, without care they will end up being stuck in a loop always "stepping aside" and never managing to move forwards.

    By "step aside" I mean that they would release the lock and attempt to let the other one acquire it. We might imagine the situation with two threads doing this (pseudocode):

    // thread 1
    getLocks12(lock1, lock2)
    {
      lock1.lock();
      while (lock2.locked())
      {
        // attempt to step aside for the other thread
        lock1.unlock();
        wait();
        lock1.lock();
      }
      lock2.lock();
    }
    
    // thread 2
    getLocks21(lock1, lock2)
    {
      lock2.lock();
      while (lock1.locked())
      {
        // attempt to step aside for the other thread
        lock2.unlock();
        wait();
        lock2.lock();
      }
      lock1.lock();
    }
    

    Race conditions aside, what we have here is a situation where both threads, if they enter at the same time will end up running in the inner loop without proceeding. Obviously this is a simplified example. A naiive fix would be to put some kind of randomness in the amount of time the threads would wait.

    The proper fix is to always respect the lock heirarchy. Pick an order in which you acquire the locks and stick to that. For example if both threads always acquire lock1 before lock2, then there is no possibility of deadlock.

提交回复
热议问题