我读C++ Concurrency in Action,并遇到了下面的语句,描述deadlock
(第47〜48):如何理解相同类的实例会导致C++ Concurrency in Action中的死锁问题?
避免死锁的共同建议是始终锁定两个互斥在同一顺序:如果你总是在互斥体B之前锁定互斥体A,那么你将永远不会死锁。有时候这很简单,因为互斥对象服务于不同的目的,但有时并不那么简单,比如当互斥对象保护同一个类的单独实例时。例如,考虑在同一类的两个实例之间交换数据的操作;为了确保数据正确交换,不受并发修改的影响,两个实例上的互斥锁都必须锁定。但是,如果选择了一个固定的顺序(例如,作为第一个参数提供的实例的互斥体,然后是作为第二个参数提供的实例的互斥体),则这可能会逆流:它只需要两个线程尝试在交换参数的同一两个实例之间交换数据,并且您有死锁!
我对以下部分的含义很困惑:
然而,如果以固定的顺序被选择(例如,互斥为作为第一个参数提供的实例,则互斥为作为第二个参数提供的实例),这可能会逆火:它只需要两个线程尝试在交换参数的同一个两个实例之间交换数据,并且发生死锁!
在前面,它指的是“an operation
”,然后它提到了“two threads to try to exchange data
”。作者想要表达的实际场景是什么?