Shell逐行处理文本求和,我人傻了...

开发 前端
为什么会这样呢?实际上,我们在《如何使用fork创建进程》中就提到过,fork的时候会拷贝父进程的数据内容,即写时复制,但是,像启动运行的线程,是不会被“复制”过去的。

本文转载自微信公众号「编程珠玑」,作者守望先生。转载本文请联系编程珠玑公众号。

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

实践

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

  1. // 来源:公众号【编程珠玑】 
  2. // 作者:守望先生 
  3. // multiThread.cc 
  4. #include <unistd.h> 
  5. #include <atomic> 
  6. #include <chrono> 
  7. #include <iostream> 
  8. #include <thread> 
  9. std::atomic<bool> start{false}; 
  10. void threadfunc() { 
  11.   while (!start) { 
  12.     std::this_thread::sleep_for(std::chrono::seconds(1)); 
  13.   } 
  14.   while (start) { 
  15.     std::this_thread::sleep_for(std::chrono::seconds(1)); 
  16.     std::cout << "thread func,pid:" << getpid() << std::endl; 
  17.   } 
  18. int main() { 
  19.   std::thread t1(threadfunc); 
  20.   // daemon(0, 1); // 后台执行 
  21.   start.store(true); 
  22.   t1.join();  // 等待threadfunc运行结束 
  23.   return 0; 

编译运行:

  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的相关行的注释去掉,再编译运行。

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

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

为什么

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

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

 

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

 

责任编辑:武晓燕 来源: 编程珠玑
相关推荐

2021-06-07 12:10:14

Shell逐行处理

2021-06-22 09:32:40

Linuxshell命令

2021-04-21 08:03:34

脚本Shell读取

2021-08-20 10:46:25

Shell脚本文件Linux

2017-03-02 18:10:20

LinuxShell命令

2016-03-30 11:16:33

2021-09-10 16:30:29

LinuxShell文本

2024-01-07 16:46:19

FiberHTTPWeb

2019-10-14 11:31:51

工具代码开发

2013-07-16 16:37:12

91百度

2013-08-30 10:25:22

Shell主机监控

2020-11-21 19:04:33

技术开发指标

2018-12-28 10:45:08

Linux文本行命令

2020-12-23 11:08:10

Python代码文本

2021-03-28 08:57:57

Python 文本数据

2013-06-03 11:28:05

shell命令

2021-06-28 10:06:21

开源文本识别pyWhat

2020-05-21 14:50:48

代码机器学习图像

2013-10-30 10:35:29

Linux命令文本处理

2021-11-03 09:00:00

深度学习自然语言机器学习
点赞
收藏

51CTO技术栈公众号