Linux线程和fork

版权声明:转载请声明 https://blog.csdn.net/qq_40732350/article/details/82746917

参考这个博客就可以了:

https://www.cnblogs.com/liyuan989/p/4279210.html

int pthread_atfork(void (*prepare)(void), void (*parent)(void),void (*child)(void));  //线程创建进程    

用pthread_atfork函数最多可以安装3个帮助清理锁的函数。

prepare处理程序:

由父进程,在fork创建子进程前调用。这个fork处理程序的任务是获取父进程定义的所有锁。

parent处理程序:

是在fork创建子进程以后、返回之前在父进程上下文中调用的。这个fork处理程序的任务是对 prepare处理程序获取的所有锁进行解锁。

child处理程序:

在fork返回之前在子进程上下文中调用。与parent fork处理程序一样, child fork处理程序也必须释放prepare fork处理程序获取的所有锁。

注意:

不会出现加锁一次解锁两次的情况,虽然看起来也许会出现。

子进程地址空间在创建时就,得到了父进程定义的所有锁的副本。

因为prepare fork处理程序获取了所有的锁,父进程中的内存和子进程中的内存内容在开始的时候是相同的。当父进程和子进程对它们锁的副本进程解锁的时候,新的内存是分配给子进程的,父进程的内存内容是复制到子进程的内存中(写时复制),所以我们就会陷入这样的假象,看起来父进程对它所有的锁的副本进行了加锁,子进程对它所有的锁的副本进行了加锁。父进程和子进程对在不同内存单元的重复的锁都进行了解锁操作,就好像出现了下列事件序列。

总结:

一般工程里就不会在多线程里面,在来搞多进程,不会自己给自己找麻烦

执行exec后,fork后的新程序可以继承原执行程序的文件锁。但是,如果一个文件描述符设置了close-on-exec标志,在执行exec时,会关闭该文件描述符,所以对应的锁也就被释放了,也就无所谓继承了。

注意:这里的文件锁不是线程的读写锁

猜你喜欢

转载自blog.csdn.net/qq_40732350/article/details/82746917