我认为locking_callback
足以在多线程环境中使用时锁定/解锁OpenSSL的共享数据结构。那么为什么需要id_callback
?也就是说,当OpenSSL需要调用它时?
答案 0 :(得分:0)
我认为在多线程环境中使用时,locked_callback足以锁定/解锁OpenSSL的共享数据结构,为什么需要id_callback?也就是说,当OpenSSL需要调用它时?
OpenSSL大约有40个锁。你可以grep CRYPTO_NUM_LOCKS
。您可以通过grep CRYPTO_LOCK_
来了解受保护的组件,例如CRYPTO_LOCK_UI
,CRYPTO_LOCK_X509_STORE
,CRYPTO_LOCK_RAND
和CRYPTO_LOCK_ENGINE
。
隐式线程标识符(如使用线程堆栈的堆栈地址)不是唯一的,因为它们可以重用。例如,来自pthread_self(3)
手册页:
线程标识符应被视为不透明:任何使用a的尝试 除了pthreads调用之外的线程ID是不可移植的并且可以导致 未明确的结果。
线程ID仅保证在进程中是唯一的。一个帖子 在终止线程加入后,可以重用ID,或者 分离的线程已经终止。 ...
因此,OpenSSL很难知道如何为线程获取唯一标识符;并且很难正确地记录和调试一些多线程问题而没有每个唯一线程的唯一标识符。由于问题的微妙之处,OpenSSL只是将其推回给程序员以提供唯一的id。
使用pthreads时,需要稍微摇晃才能正确使用。例如,使用pthreads,您应该提供唯一的每线程计数器。请参阅How to assign unique ids to threads in a pthread wrapper?和Retrieve pthread_create's arg from outside the thread?
以下是Stack Overflow的一些相关问题:
答案 1 :(得分:0)
在OpenSSL中,每个线程都有一个错误队列,所以线程id必须找到错误代码所在的错误队列,我认为这是id_callback的目的之一。