自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

開發(fā) 前端
為什么會(huì)這樣呢?實(shí)際上,我們?cè)凇度绾问褂胒ork創(chuàng)建進(jìn)程》中就提到過,fork的時(shí)候會(huì)拷貝父進(jìn)程的數(shù)據(jù)內(nèi)容,即寫時(shí)復(fù)制,但是,像啟動(dòng)運(yùn)行的線程,是不會(huì)被“復(fù)制”過去的。

本文轉(zhuǎn)載自微信公眾號(hào)「編程珠璣」,作者守望先生。轉(zhuǎn)載本文請(qǐng)聯(lián)系編程珠璣公眾號(hào)。

一個(gè)多線程進(jìn)程fork出來的進(jìn)程是多線程還是單線程的?先說結(jié)論:是單線程的。

實(shí)踐

口說無憑,我們先寫段代碼實(shí)踐驗(yàn)證一下。

  1. // 來源:公眾號(hào)【編程珠璣】 
  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); // 后臺(tái)執(zhí)行 
  21.   start.store(true); 
  22.   t1.join();  // 等待threadfunc運(yùn)行結(jié)束 
  23.   return 0; 

編譯運(yùn)行:

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

結(jié)果正常,線程不斷循環(huán)打印信息。那如果啟動(dòng)線程后,再fork呢?即將代碼中daemon的相關(guān)行的注釋去掉,再編譯運(yùn)行。

在《如何讓程序真正地后臺(tái)運(yùn)行?》中我們知道,daemon實(shí)際上做了進(jìn)程的fork。

運(yùn)行這個(gè)例子,我們會(huì)發(fā)現(xiàn),程序立馬退出了,沒有打印我們預(yù)想的內(nèi)容。

為什么

為什么會(huì)這樣呢?實(shí)際上,我們?cè)凇度绾问褂胒ork創(chuàng)建進(jìn)程》中就提到過,fork的時(shí)候會(huì)拷貝父進(jìn)程的數(shù)據(jù)內(nèi)容,即寫時(shí)復(fù)制,但是,像啟動(dòng)運(yùn)行的線程,是不會(huì)被“復(fù)制”過去的。也就是說,從父進(jìn)程fork出來的子進(jìn)程,將會(huì)是單線程的。這也就給了我們一些啟示

如果在API中需要啟動(dòng)工作線程,則工作線程需要在daemon化之后再啟動(dòng)

 

怎么理解呢?比如說,你設(shè)計(jì)了某一個(gè)功能,你的功能是需要啟動(dòng)一個(gè)線程來進(jìn)程工作,那么你在使用的時(shí)候,就必須要特別注意這種fork進(jìn)程的場(chǎng)景,即需要在fork之后啟動(dòng)線程,才能保證線程能夠正常啟動(dòng)并工作。

 

責(zé)任編輯:武曉燕 來源: 編程珠璣
相關(guān)推薦

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

2024-09-12 17:39:27

2021-09-10 16:30:29

LinuxShell文本

2024-01-07 16:46:19

FiberHTTPWeb

2019-10-14 11:31:51

工具代碼開發(fā)

2024-08-12 09:43:42

2013-07-16 16:37:12

91百度

2013-08-30 10:25:22

Shell主機(jī)監(jiān)控

2020-11-21 19:04:33

技術(shù)開發(fā)指標(biāo)

2018-12-28 10:45:08

Linux文本行命令

2020-12-23 11:08:10

Python代碼文本

2021-03-28 08:57:57

Python 文本數(shù)據(jù)

2013-06-03 11:28:05

shell命令

2021-06-28 10:06:21

開源文本識(shí)別pyWhat

2020-05-21 14:50:48

代碼機(jī)器學(xué)習(xí)圖像
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)