我听说在程序中混合分叉和线程可能非常有问题,通常会产生神秘的行为,特别是在处理共享资源时,例如锁,管道,文件描述符.但我从未完全明白危险是什么以及何时会发生.如果具有该领域专业知识的人能够更详细地解释在这样的环境中编程时存在哪些陷阱以及需要注意什么,那将是很棒的.
例如,如果我想编写一个从各种不同资源收集数据的服务器,我认为一个解决方案是让服务器生成一组线程,每个popen调用另一个程序来完成实际工作,打开管道从孩子那里获取数据.这些线程中的每一个都响应它自己的工作,没有数据交换它们,并且当收集数据时,主线程有一个队列,这些工作线程只将结果放入队列.这个解决方案可能出现什么问题?
请不要通过"回答"我的示例场景来缩小您的答案范围.任何与示例无关但有助于提供简洁设计的建议,替代解决方案或体验都会非常棒!谢谢!
在Linux系统上,子进程是否以与父进程相同的方式查看现有线程?
int main() {
//create thread 1
int child_pid = fork();
if ( 0 == child_pid)
{
..
}
else
{
..
}
Run Code Online (Sandbox Code Playgroud)
由于为子进程复制了整个地址空间,因此线程的状态会发生什么.如果上段中的线程1正在等待条件信号,该怎么办?是否在儿童过程中处于等待状态?
众所周知,在 POSIX 下创建新进程的默认方式是使用fork()(在 Linux 下这内部映射到clone(...))
我想知道的是:众所周知,当有人调用fork()“子进程是用单个线程创建的——调用的那个线程fork()”时(参见https://linux.die.net/man/ 2/叉)。如果例如其他线程当前持有锁,这当然可能会导致问题。对我来说,不分叉进程中存在的所有线程直观上感觉像是“泄漏抽象”。
所以我想知道:为什么fork()子进程中只会存在线程调用而不是进程的所有线程?这有很好的技术原因吗?
我知道在多线程分叉上有一个相关的问题,但那里给出的答案并不能回答我的问题。