日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
多線程進(jìn)程fork出來(lái)的進(jìn)程是單線程還是多線程?

本文轉(zhuǎn)載自微信公眾號(hào)【編程珠璣】(shouwangxiansheng)。

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

實(shí)踐

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

 
 
 
  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); // 后臺(tái)執(zhí)行
  20.   start.store(true);
  21.   t1.join();  // 等待threadfunc運(yùn)行結(jié)束
  22.   return 0;
  23. }

編譯運(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)行。

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

為什么

為什么會(huì)這樣呢?實(shí)際上,fork的時(shí)候會(huì)拷貝父進(jìn)程的數(shù)據(jù)內(nèi)容,即寫(xiě)時(shí)復(fù)制,但是,像啟動(dòng)運(yùn)行的線程,是不會(huì)被“復(fù)制”過(guò)去的。也就是說(shuō),從父進(jìn)程fork出來(lái)的子進(jìn)程,將會(huì)是單線程的。這也就給了我們一些啟示:

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

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


新聞名稱:多線程進(jìn)程fork出來(lái)的進(jìn)程是單線程還是多線程?
文章路徑:http://m.5511xx.com/article/cdooids.html