【发布时间】:2015-07-21 10:50:38
【问题描述】:
我认为locking_callback 在多线程环境中使用时足以锁定/解锁 OpenSSL 的共享数据结构。那么为什么需要id_callback?也就是OpenSSL什么时候需要调用呢?
【问题讨论】:
标签: openssl
我认为locking_callback 在多线程环境中使用时足以锁定/解锁 OpenSSL 的共享数据结构。那么为什么需要id_callback?也就是OpenSSL什么时候需要调用呢?
【问题讨论】:
标签: openssl
我认为locking_callback在多线程环境中使用时足以锁定/解锁OpenSSL的共享数据结构,那么为什么需要id_callback呢?也就是OpenSSL什么时候需要调用它?
OpenSSL 有大约 40 个锁。您可以使用 grep 搜索 CRYPTO_NUM_LOCKS。您可以使用 grep for CRYPTO_LOCK_ 来了解受保护的组件,例如 CRYPTO_LOCK_UI、CRYPTO_LOCK_X509_STORE、CRYPTO_LOCK_RAND 和 CRYPTO_LOCK_ENGINE。
隐式线程标识符,例如使用线程堆栈的堆栈地址,不是唯一的,因为它们可以重复使用。例如,来自pthread_self(3) 手册页:
线程标识符应该被认为是不透明的:任何尝试使用 pthreads 调用以外的线程 ID 是不可移植的,并且可能导致 未指定的结果。
线程 ID 只保证在一个进程中是唯一的。一根线 ID 可以在终止的线程加入后被重用,或者 分离的线程已终止。 ...
因此,OpenSSL 很难知道如何获取线程的唯一标识符;如果没有每个唯一线程的唯一标识符,很难正确记录和调试一些多线程问题。由于问题的微妙之处,OpenSSL 只是将其推回给程序员以提供唯一 ID。
当使用 pthreads 时,需要稍微调整一下才能正确。例如,对于 pthread,您应该提供一个唯一的每线程计数器。见How to assign unique ids to threads in a pthread wrapper?和Retrieve pthread_create's arg from outside the thread?
以下是有关 Stack Overflow 的一些相关问题:
【讨论】:
在OpenSSL中,每个线程都有一个错误队列,因此需要线程id来定位错误代码所在的错误队列,我认为这是id_callback的目的之一。
【讨论】: