为什么 pthread_equal 是线程安全的?

Why is pthread_equal threadsafe?

如果我查看 pthread_equal 的实现,它看起来如下:

int
__pthread_equal (pthread_t thread1, pthread_t thread2)
{
  return thread1 == thread2;
}
weak_alias (__pthread_equal, pthread_equal)

typedef unsigned long int pthread_t;

Posix 文档说 pthread_equal 是线程安全的。但是对 pthread_equals 的调用会复制并因此访问 thread1thread2 变量。如果这些变量是全局变量并且此时被另一个线程更改,这将导致未定义的行为。

所以 pthread_t 不应该是原子的吗?或者它是否以其他方式确保以原子方式运行?

当我们说一个操作是线程安全的时,我们对调用该操作的代码做出了某些假设。这些假设包括确保操作的输入是稳定的,并且它们的值在操作完成之前保持有效和稳定。否则,没有什么是线程安全的。

pthread_equal 的实现(将特定于它附带的 POSIX 实现)不访问除本地变量之外的任何变量。在 C 语言中,参数总是 按值 传递。 thread1thread2 是函数中的局部变量,它们从调用者进行调用时使用的表达式中获取它们的值。

话虽如此,即使不是,这里也不会有线程不安全的问题。相反,如果调用者访问了 pthread_t 可以被其他线程同时更改的对象,而不使用适当的同步机制来排除这种情况,那么这是调用者中的数据竞争错误,而不是被调用者中的线程安全问题。