TAILQ_EMPTY()操作是否需要获取锁

Is it necessary to acquire lock for TAILQ_EMPTY() operation

我喜欢在访问队列之前检查队列是否为空。在那种情况下,是否有必要为 TAILQ_EMPTY() 操作获取锁。通过TAILQ_EMPTY()的定义,好像是在读队列,所以我猜是不会用锁的。我说得对吗?

#define TAILQ_EMPTY(head) ((head)->tqh_first == NULL)

如果只有一个 process/thread 访问队列,则不需要使用锁,因为您没有对队列的任何并发访问。

但是,如果您有多个 processes/threads 以并发方式访问队列插入和删除元素,那么您需要使用锁来保护这些访问。

例如,假设您测试队列是否为空但其他 process/thread 正在同时向队列中插入元素的情况。如果您不在编写代码时考虑到这些情况,那么您的代码将具有不确定性。

阅读 sys/queue.h 的代码表明没有防止并发访问的保护,所以如果你有并发代码,你必须自己处理它们。