没有exec的fork,以及共享对象使用的pthread_mutex_t

时间:2013-12-13 00:45:07

标签: linux multithreading pthreads posix fork

我正在使用一个执行fork而没有exec的网络服务器项目。该程序依赖于OpenSSL,而OpenSSL需要一些锁(CRYPTO_NUM_LOCKS来确切,目前约为40)。 Linux上的锁通常是pthread_mutex_t,它们是在创建任何线程之前在主线程上安装/创建的。

fork创建了一个新流程。但是,在fork之后,互斥锁中使用的句柄被浅层复制。也就是说,它们具有相同的位,但我不认为它们在新过程的上下文中具有有用的价值。

我认为一般问题是共享对象中的线程和fork安全性。 libcrypto上的OpenSSL wiki页面讨论了thread and fork safety,我不确定如何解决一些问题。

有没有办法指定应该在fork上重新初始化一个库(例如OpenSSL)?

1 个答案:

答案 0 :(得分:2)

互斥锁在fork之间无效,除非您将它们放在共享内存中并初始化设置为PTHREAD_PROCESS_SHARED的pthread_mutexattr_setpshared的互斥锁属性。

目前尚不清楚你是在分叉,然后创建线程或创建线程然后分叉。如果是后者,则fork只会应用于调用fork的线程。在新进程中没有创建其他线程。

如果你正在分叉然后线程化,那么互斥锁只适用于子进程及其线程,那么只需在fork之后创建它们。