这是一个假设,而我正在调试一些代码。假设我有一个应用程序(称为X)调用lib来通过TLS加密的SMTP连接发送电子邮件,同时X正在与另一个通过同一libcrypto lib建立另一个TLS套接字的lib进行通信,获得一些特定(和奇怪)条件的可能性是什么,其中一个函数调用会因segfault而失败?
我有点抓住稻草,这段代码工作正常,直到我们添加了通过TLS连接到Skype服务器的Skype SDK,从那时起我们实际上可以让问题重复,但我有点困惑至于为什么。 (我可能会忽略显而易见的事情,但我会从非常奇怪的可能性开始)
答案 0 :(得分:2)
从一般来说,这可能是有可能的 - 但是编写良好的库应该对多重访问具有强大的功能。您可能希望查看文档以查看其API是否可重入(或者甚至是安全的)。
如果它是线程安全的,那么(假设libcrypto作者没有犯错误)你可以确定它不是问题的原因。
如果它是可重入的,那么在两个(或多个)线程中使用此lib的任何内容都应该在访问时同步(例如,使用互斥锁),但是如果部分代码不是由您编写的,则您无法修改它那你就被困住了。我唯一能想到的就是使用另一个版本的libcrypto,因此系统会创建另一个不相关的内部结构实例。这是丑陋的灵魂,可能在用户机器上表现得很奇怪。
答案 1 :(得分:2)
有一整页专门讨论OpenSSL库和线程的使用:man 3 threads
。如果您的应用程序有多个使用OpenSSL库的线程,则需要使用它。