前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多线程进程fork出来的进程是单线程还是多线程?

多线程进程fork出来的进程是单线程还是多线程?

作者头像
编程珠玑
发布2021-06-21 20:08:40
1.5K0
发布2021-06-21 20:08:40
举报
文章被收录于专栏:编程珠玑编程珠玑

一个多线程进程fork出来的进程是多线程还是单线程的?先说结论:是单线程的。

实践

口说无凭,我们先写段代码实践验证一下。

代码语言:javascript
复制
// 来源:公众号【编程珠玑】
// 作者:守望先生
// multiThread.cc
#include <unistd.h>
#include <atomic>
#include <chrono>
#include <iostream>
#include <thread>
std::atomic<bool> start{false};
void threadfunc() {
  while (!start) {
    std::this_thread::sleep_for(std::chrono::seconds(1));
  }
  while (start) {
    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::cout << "thread func,pid:" << getpid() << std::endl;
  }
}
int main() {
  std::thread t1(threadfunc);
  // daemon(0, 1); // 后台执行
  start.store(true);
  t1.join();  // 等待threadfunc运行结束
  return 0;
}

编译运行:

代码语言:javascript
复制
$ g++ -o multiThread multiThread.cc -lphtread
$ ./multiThread
thread func,pid:9901
thread func,pid:9901
thread func,pid:9901

结果正常,线程不断循环打印信息。那如果启动线程后,再fork呢?即将代码中daemon的相关行的注释去掉,再编译运行。

在《如何让程序真正地后台运行?》中我们知道,daemon实际上做了进程的fork。

运行这个例子,我们会发现,程序立马退出了,没有打印我们预想的内容。

为什么

为什么会这样呢?实际上,我们在《如何使用fork创建进程》中就提到过,fork的时候会拷贝父进程的数据内容,即写时复制,但是,像启动运行的线程,是不会被“复制”过去的。也就是说,从父进程fork出来的子进程,将会是单线程的。这也就给了我们一些启示

  • 如果在API中需要启动工作线程,则工作线程需要在daemon化之后再启动

怎么理解呢?比如说,你设计了某一个功能,你的功能是需要启动一个线程来进程工作,那么你在使用的时候,就必须要特别注意这种fork进程的场景,即需要在fork之后启动线程,才能保证线程能够正常启动并工作。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程珠玑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实践
  • 为什么
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档