即使是使用令牌机制,线程分析器也会报告该实现存在潜在死锁(虽然并不存在死锁)。这是一个误报。请参考以下包含潜在死锁详细信息的屏幕抓图。
选择循环链中的第一个线程(线程 2),然后单击 "Dual Source"(双源)标签,可以看到线程 2 在地址 0x216a8
持有锁的对应源代码位置,以及该线程在 0x216c0
请求锁的对应源代码位置。下图显示了对应于线程 2 的 "Dual Source"(双源)标签。
din_philo_fix1.c 中的 get_token() 函数使用 while 循环来同步线程。线程在成功获得令牌之前不会离开 while
循环(当 num_can_eat
大于 0 时可成功获得令牌)。while
循环将同时就餐的人数限制为 4。但是,线程分析器无法识别由 while
循环实现的同步。它认为所有五位哲学家同时尝试抓取筷子并进餐,因此报告了一个潜在死锁。下一节将详细说明如何使用线程分析器可识别的同步来限制同时就餐的人数。