【发布时间】:2020-07-21 18:27:49
【问题描述】:
我喜欢在访问队列之前检查队列是否为空。在这种情况下,是否有必要为 TAILQ_EMPTY() 操作获取锁。通过TAILQ_EMPTY()的定义,好像是在读队列,所以估计不用锁了。我说的对吗?
#define TAILQ_EMPTY(head) ((head)->tqh_first == NULL)
【问题讨论】:
我喜欢在访问队列之前检查队列是否为空。在这种情况下,是否有必要为 TAILQ_EMPTY() 操作获取锁。通过TAILQ_EMPTY()的定义,好像是在读队列,所以估计不用锁了。我说的对吗?
#define TAILQ_EMPTY(head) ((head)->tqh_first == NULL)
【问题讨论】:
如果您只有一个进程/线程访问队列,则不需要使用锁,因为您没有对队列的任何并发访问。
但是,如果您有多个进程/线程以并发方式访问队列插入和删除元素,那么您需要使用锁来保护这些访问。
例如,假设您测试队列是否为空,但其他进程/线程同时在队列中插入一个元素。如果您在编写代码时没有考虑到这种情况,那么您的代码的行为将是不确定的。
阅读sys/queue.h 的代码表明没有针对并发访问的保护,因此如果您有并发代码,则必须自己处理。
【讨论】: