2017-04-01 69 views
0

如何命名一个线程被锁定的情况,永久等待?我发现,什么时候两个线程碰撞,这就是所谓的几个例子race conditionPosix线程锁定:永久等待

A race condition occurs when two or more threads 
can access shared data and they try to 
change it at the same time 

但是,当一个线程是stuck waiting forever for another thread,没有任何特定术语来命名这种情况,或者还它仍然被命名为竞争条件,即使我们有两个线程不会尝试同时访问共享数据,但是相反......其中一个线程被锁定,永远等待第二个线程?

+3

它被称为死锁。 –

+1

..或可能活锁,如果线程在100%的CPU。 – ThingyWotsit

+0

这取决于线程为什么在等待。如果线程1正在使用一个资源,然后开始等待另一个资源是空闲的,但是这个其他资源永远不会被释放,因为线程2声称它正在等待资源线程1拥有,这就是死锁(并有几个版本的相同的东西,但他们都大致相同的想法)。如果其中一个线程在另一个线程中等待,另一个线程永远不会因其他原因而结束(例如无限循环),这只是一个无限循环。 –

回答

0

如果Thread_1正在等待Thread_2,并且同时Thread_2正在等待Thread_1。这就是所谓的死锁。当发生死锁时,就像两个线程相互争夺。

另一种情况称为活锁。活锁只是有一个线程永远等待另一个线程的情况。如果Thread_2正在等待Thread_1。而Thread_2想要从Thread_1获得写锁。但是此时又出现了另一个Thread_3。 Thread_3也希望从Thread_1获得写入锁定。不幸的是,Thread_3的优先级高于Thread_2。所以当Thread_1释放写锁时。 Thread_3立即获得了该写锁。并且出现了Thread_4,Thread_4与Thread_3具有相同的优先级...

Thread_2似乎永远在等待写锁。这就是所谓的活锁。 为了避免这个问题,我们可以建立一个服务器队列。哪个线程提前排队,我们先处理那个更早的线程。

Pthread为我们提供了锁定资源的方式。我们可以使用互斥或​​其他的东西。但是我们在使用锁之后必须解决这个问题。

您可以在并发控制中获得关于此主题的更多信息。