我正在处理一个web服务器项目,它执行一个不带forkexec。这个程序依赖于OpenSSL,OpenSSL需要很多锁(确切地说,现在大约是40个)。在Linux上,锁通常CRYPTO_NUM_LOCKS,在创建任何线程之前,锁都是在主线程上安装/创建的。
pthread_mutex_t创建新进程。但是,在fork之后,互斥锁中使用的句柄将被浅复制。也就是说,它们具有相同的位,但我不相信它们在新流程的上下文中有什么有用的价值。
我认为一般的问题是共享对象中线程和叉的安全性。fork上的OpenSSL wiki页讨论了thread and fork safety,我不确定如何解决一些问题。
是否有方法指定库(如OpenSSL)应在libcrypto上重新初始化?

最佳答案

除非将互斥锁放在共享内存中并使用设置为PTHREAD_PROCESS_shared的fork初始化互斥锁属性,否则互斥锁在pthread_mutexattr_setpshared中无效。
不清楚是先分叉然后创建线程,还是先创建线程然后分叉。如果是后者,那么fork将只应用于调用fork的线程。其他线程都不会在新进程中创建。
如果您正在分叉,然后是线程,而互斥量只应用于子进程及其线程,那么只需在分叉之后创建它们。

关于linux - 不带exec的fork和共享对象使用的pthread_mutex_t,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20557185/

10-16 11:29