为什么 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
的调用会复制并因此访问 thread1
和 thread2
变量。如果这些变量是全局变量并且此时被另一个线程更改,这将导致未定义的行为。
所以 pthread_t
不应该是原子的吗?或者它是否以其他方式确保以原子方式运行?
当我们说一个操作是线程安全的时,我们对调用该操作的代码做出了某些假设。这些假设包括确保操作的输入是稳定的,并且它们的值在操作完成之前保持有效和稳定。否则,没有什么是线程安全的。
此 pthread_equal
的实现(将特定于它附带的 POSIX 实现)不访问除本地变量之外的任何变量。在 C 语言中,参数总是 按值 传递。 thread1
和 thread2
是函数中的局部变量,它们从调用者进行调用时使用的表达式中获取它们的值。
话虽如此,即使不是,这里也不会有线程不安全的问题。相反,如果调用者访问了 pthread_t
可以被其他线程同时更改的对象,而不使用适当的同步机制来排除这种情况,那么这是调用者中的数据竞争错误,而不是被调用者中的线程安全问题。
如果我查看 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
的调用会复制并因此访问 thread1
和 thread2
变量。如果这些变量是全局变量并且此时被另一个线程更改,这将导致未定义的行为。
所以 pthread_t
不应该是原子的吗?或者它是否以其他方式确保以原子方式运行?
当我们说一个操作是线程安全的时,我们对调用该操作的代码做出了某些假设。这些假设包括确保操作的输入是稳定的,并且它们的值在操作完成之前保持有效和稳定。否则,没有什么是线程安全的。
此 pthread_equal
的实现(将特定于它附带的 POSIX 实现)不访问除本地变量之外的任何变量。在 C 语言中,参数总是 按值 传递。 thread1
和 thread2
是函数中的局部变量,它们从调用者进行调用时使用的表达式中获取它们的值。
话虽如此,即使不是,这里也不会有线程不安全的问题。相反,如果调用者访问了 pthread_t
可以被其他线程同时更改的对象,而不使用适当的同步机制来排除这种情况,那么这是调用者中的数据竞争错误,而不是被调用者中的线程安全问题。