尽管使用了令牌机制,线程分析器仍为此实现报告了一个潜在死锁(虽然并不存在死锁)。这是一个误报。考虑以下包含潜在死锁详细信息的屏幕抓图:
选择该链中的第一个线程(线程 #2),然后单击“双重数据源”选项卡,查看线程 #2 在源代码中占用锁的位置(在地址 0x215a8
)以及请求锁的位置(在地址 0x215c0
)。以下屏幕抓图显示了线程 #2 的“双重数据源”选项卡。
din_philo_fix1.c 中的 get_token() 函数使用 while 循环同步线程。在成功获得一个令牌(当 num_can_eat
大于 0 时将发生这种情况)之前,线程不会离开 while
循环。while
循环将同时进餐的人数限制为 4。但是线程分析器无法识别 while
循环实现的同步。它假定所有 5 个哲人都尝试同时取筷子并进餐,因此报告了一个潜在死锁。下一部分将详细说明如何使用线程分析器可识别的同步限制同时进餐的人数。