【问题标题】:The need for id_callback when in a multithread environment?在多线程环境中是否需要 id 回调?
【发布时间】:2015-07-21 10:50:38
【问题描述】:

我认为locking_callback 在多线程环境中使用时足以锁定/解锁 OpenSSL 的共享数据结构。那么为什么需要id_callback?也就是OpenSSL什么时候需要调用呢?

【问题讨论】:

    标签: openssl


    【解决方案1】:

    我认为locking_callback在多线程环境中使用时足以锁定/解锁OpenSSL的共享数据结构,那么为什么需要id_callback呢?也就是OpenSSL什么时候需要调用它?

    OpenSSL 有大约 40 个锁。您可以使用 grep 搜索 CRYPTO_NUM_LOCKS。您可以使用 grep for CRYPTO_LOCK_ 来了解受保护的组件,例如 CRYPTO_LOCK_UICRYPTO_LOCK_X509_STORECRYPTO_LOCK_RANDCRYPTO_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 的一些相关问题:

    【讨论】:

    • 感谢您的回答。 “如果没有每个唯一线程的唯一标识符,很难正确记录和调试一些多线程问题”,所以我可以说这个标识符仅用于记录/调试目的,而不需要锁定/解锁?
    • @Array - OpenSSL 没有从线程 ID 获取唯一 ID 的通用方法。一种尺寸并不适合所有人。你必须提供它。
    • 是的,我明白了。我必须提供 id 才能在多线程环境中使用 OpenSSL。我想知道的是除了调试/日志之外,这个id是否对于锁定/解锁机制是必需的?
    【解决方案2】:

    在OpenSSL中,每个线程都有一个错误队列,因此需要线程id来定位错误代码所在的错误队列,我认为这是id_callback的目的之一。

    【讨论】:

      猜你喜欢
      • 2010-09-16
      • 2010-12-20
      • 2016-08-15
      • 2012-10-10
      • 1970-01-01
      • 2017-08-09
      • 2011-06-13
      • 2018-04-13
      • 1970-01-01
      相关资源
      最近更新 更多