Multithreading 多线程进程中的同步

Multithreading 多线程进程中的同步,multithreading,synchronization,thread-safety,fork,Multithreading,Synchronization,Thread Safety,Fork,如果我有一个创建N个线程的进程;即T1。。。。Tn.假设N个线程正在使用锁L在它们之间进行同步。如果此进程调用fork() 创建的新子进程有N个线程还是只有1个线程?从,看起来它只有一个线程 锁L以相同的值复制到新的内存(物理)位置,对吗 若问题(1)的答案是只有一个线程被复制,那个么若T1锁定了L,并且从另一个线程T2调用了fork(),那个么在新进程中会发生什么呢。我会一直被锁着吗 除非在生成线程之前调用fork(),否则它只能靠自己。分叉不会复制子线程/进程 进程堆中的数据在分叉时复制到新

如果我有一个创建N个线程的进程;即T1。。。。Tn.假设N个线程正在使用锁L在它们之间进行同步。如果此进程调用fork()

  • 创建的新子进程有N个线程还是只有1个线程?从,看起来它只有一个线程
  • 锁L以相同的值复制到新的内存(物理)位置,对吗
  • 若问题(1)的答案是只有一个线程被复制,那个么若T1锁定了L,并且从另一个线程T2调用了fork(),那个么在新进程中会发生什么呢。我会一直被锁着吗
  • 除非在生成线程之前调用fork(),否则它只能靠自己。分叉不会复制子线程/进程

  • 进程堆中的数据在分叉时复制到新进程(最有可能使用写时复制)。如果锁存储在堆中,它将获得自己的副本,因为进程有自己的堆
  • 使用常规锁(而不是信号量),任何线程都可以锁定/解锁它

  • 新进程最初只有一个正在运行的线程。该进程的互斥体副本将永远被锁定,除非显式重新初始化或互斥体在进程之间共享(PTHREAD_process_shared属性,不支持无处不在)

    以下是规范在其讨论中对这种情况所做的说明,其中引入的功能部分是为了解决这种不愉快:

    考虑这样一种情况,其中一个线程锁定了一个互斥锁,并且状态为 当另一个线程调用时,该互斥所覆盖的对象不一致 fork()。在子对象中,互斥锁处于锁定状态(由 不存在线程,因此永远无法解锁)。让子对象简单地重新初始化互斥对象是不令人满意的,因为这种方法无法解决如何更正或以其他方式处理子对象中不一致状态的问题


    “如果锁存储在堆中,它将获得自己的副本。如果为它分配内存,它将不会被复制”分配内存是从堆中完成的,对吗?我明白了。因此,如果锁来自堆,则只复制“指针值”,即“虚拟地址空间”中的锁地址。但对于孩子和家长,都会有“单独的物理拷贝”。我说的对吗?好吧,我把术语弄混了,我起得太晚了。在本例中,malloc分配了堆数据,因此是的,您将获得锁的一个全新副本。