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

本文转载自微信公众号【编程珠玑】(shouwangxiansheng)。

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

实践

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

 
 
 
  1. // multiThread.cc
  2. #include 
  3. #include 
  4. #include 
  5. #include 
  6. #include 
  7. std::atomic start{false};
  8. void threadfunc() {
  9.   while (!start) {
  10.     std::this_thread::sleep_for(std::chrono::seconds(1));
  11.   }
  12.   while (start) {
  13.     std::this_thread::sleep_for(std::chrono::seconds(1));
  14.     std::cout << "thread func,pid:" << getpid() << std::endl;
  15.   }
  16. }
  17. int main() {
  18.   std::thread t1(threadfunc);
  19.   // daemon(0, 1); // 后台执行
  20.   start.store(true);
  21.   t1.join();  // 等待threadfunc运行结束
  22.   return 0;
  23. }

编译运行:

 
 
 
  1. $ g++ -o multiThread multiThread.cc -lphtread
  2. $ ./multiThread
  3. thread func,pid:9901
  4. thread func,pid:9901
  5. thread func,pid:9901

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

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

为什么

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

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

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

文章名称:多线程进程fork出来的进程是单线程还是多线程?
分享地址:http://www.shufengxianlan.com/qtweb/news46/456596.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联