C++多程序,迴圈fork詳解
因為我們現在要處理31個省的資料,但是每個省的資料量都很大,順序執行是在太慢了。本來想用多執行緒,但是都是類裡面的方法,用起來也很扯淡,所以就選擇了多程序。
fork()函式
#include <unistd.h>
//On success, The PID of the process is returned in the parent, and 0 is returned in the child. On failure,
//-1 is returned in the parent, no child process is created, and errno is set appropriately.
pid_t fork (void);
在作業系統的基本概念中程序是程式的一次執行,且是擁有資源的最小單位和排程單位(在引入執行緒的作業系統中,執行緒是最小的排程單位)。在Linux系統中建立程序有兩種方式:一是由作業系統建立,二是由父程序建立程序(通常為子程序)。系統呼叫函式fork()是建立一個新程序的唯一方式,當然vfork()也可以建立程序,但是實際上其還是呼叫了fork()函式。fork()函式是Linux系統中一個比較特殊的函式,其一次呼叫會有兩個返回值,下面是fork()函式的宣告:
當程式呼叫fork()函式並返回成功之後,程式就將變成兩個程序,呼叫fork()者為父程序,後來生成者為子程序。這兩個程序將執行相同的程式文字,但卻各自擁有不同的棧段、資料段以及堆疊拷貝。子程序的棧、資料以及棧段開始時是父程序記憶體相應各部分的完全拷貝,因此它們互不影響。從效能方面考慮,父程序到子程序的資料拷貝並不是建立時就拷貝了的,而是採用了寫時拷貝(copy-on -write)技術來處理。呼叫fork()之後,父程序與子程序的執行順序是我們無法確定的(即排程程序使用CPU),意識到這一點極為重要,因為在一些設計不好的程式中會導致資源競爭,從而出現不可預知的問題。
#include<stdio.h>
#include<unistd.h>
#include <sys/types.h>
#include<vector>
#include <iostream>
using namespace std;
int main()
{
string sMatch;
pid_t pid;
vector<string> provList;
provList.push_back("100");
provList.push_back("200");
provList.push_back("300" );
provList.push_back("400");
provList.push_back("500");
cout<<"main process,id="<<getpid()<<endl;
//迴圈處理"100,200,300,400,500"
for (vector<string>::iterator it = provList.begin(); it != provList.end(); ++it)
{
sMatch=*it;
pid = fork();
//子程序退出迴圈,不再建立子程序,全部由主程序建立子程序,這裡是關鍵所在
if(pid==0||pid==-1)
{
break;
}
}
if(pid==-1)
{
cout<<"fail to fork!"<<endl;
exit(1);
}
else if(pid==0)
{
//這裡寫子程序處理邏輯
cout<<"this is children process,id="<<getpid()<<",start to process "<<sMatch<<endl;
sleep(10);
exit(0);
}
else
{
//這裡主程序處理邏輯
cout<<"this is main process,id="<<getpid()<<",end to process "<<sMatch<<endl;
exit(0);
}
return 0;
}
執行效果如下圖:
相關推薦
C++多程序,迴圈fork詳解
因為我們現在要處理31個省的資料,但是每個省的資料量都很大,順序執行是在太慢了。本來想用多執行緒,但是都是類裡面的方法,用起來也很扯淡,所以就選擇了多程序。 fork()函式 #include <unistd.h> //On success,
Linux 多工程式設計——多程序:vfork() 函式詳解
所需標頭檔案: #include <sys/types.h> #include <unistd.h> pid_t vfork(void); 功能: vfork() 函式和 fork() 函式(fork()如何使用,請點此連結)一樣都是在已有的
Python 多程序 multiprocessing.Pool類詳解
multiprocessing模組 multiprocessing包是Python中的多程序管理包。它與 threading.Thread類
C++多執行緒函式CreateThread()詳解
採用CreateThread()建立多執行緒程式 原創 2012年12月10日 11:44:59
c語言—棧區,堆區,全局區,文字常量區,程序代碼區 詳解
註意 進制 但是 ack int 運行時 內存區域 否則 數組 轉:http://www.cnblogs.com/xiaowenhui/p/4669684.html 一、預備知識—程序的內存分配 一個由C/C++編譯的程序占用的內存分為以下幾個部分1、棧區(stack)—
Linux 多工程式設計——多程序建立:fork() 和vfork() 函式詳解
一、fork() 函式詳解 需要的標頭檔案: #include <sys/types.h> #include <unistd.h> pid_t fork(void); 功能: 用於從一個已存在的程序中建立一個新程序,新程序稱為子程序,原程序稱為父程序。
Python 多程序 fork()詳解
程序 程序是程式的一次動態執行過程,它對應了從程式碼載入、執行到執行完畢的一個完整過程。程序是系統進行資源分配和排程的一個獨立單位。程序是由程式碼(堆疊段)、資料(資料段)、核心狀態和一組暫存器組成。 在多工作業系統中,通過執行多個程序來併發地執行多個任務。
Eureka 2.X 停止開發,但註冊中心還有更多選擇:Consul 使用詳解
轉發 困難 oos work 安全 關註 新版本 復制 zookeep 在上個月我們知道 Eureka 2.X 遇到困難停止開發了,但其實對國內的用戶影響甚小,一方面國內大都使用的是 Eureka 1.X 系列,另一方面 Spring Cloud 支持很多服務發現的軟件,E
07_Linux中的程序管理問題,簡單圖文詳解!
什麼是程序 程序是作業系統中非常重要的一個概念,程序是程式的執行過程啊,程序同時也是動態的,在linux系統中,他與使用者許可權有關係,但是程式與程序並沒有相互對應,一個程式可能對應多個程序 子程序與父程序:一個程序產生另外一個程序,產生的程序稱為子
nohup和&後臺執行,程序檢視及終止 詳解
nohup 和重定向 功能一樣,可用於定時啟動 1.nohup 用途:不掛斷地執行命令。 語法:nohup Command [ Arg … ] [ & ] 無論是否將 nohup 命令的輸出重定向到終端,輸出都將附加到當前目錄的 n
Linux C程式設計--fork 詳解
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
Spring Cloud:Eureka 2.X 停止開發,但註冊中心還有更多選擇:Consul 使用詳解(13)
在上個月我們知道 Eureka 2.X 遇到困難停止開發了,但其實對國內的使用者影響甚小,一方面國內大都使用的是 Eureka 1.X 系列,另一方面 Spring Cloud 支援很多服務發現的軟體,Eureka 只是其中之一,下面是 Spring Cloud 支援的服務發現軟體以及特性對比:
js網站國際化,多國語言切換【詳解】
JS網站國際化,多國語言切換【詳解】 作者:Anmbition 在web開發過程中通常會碰到需要多國語言支援的需求,我也看過一些文件,但寫的都不盡人意,最終我整理了一套通過js程式碼完成解決方案,並對程式碼進行了很大程度的優化,在使用過程中只需極少的程式碼即可完成。 第一步:核心JS
C/C++結構體對齊方式詳解,從記憶體地址進行解析
注意:童鞋們如果仔仔細細看完這篇部落格,肯定能明白結構體的對齊方式。 最近在做一個專案的時候,客戶給的鐳射點雲檔案是二進位制形式,因此需要根據客戶定義的結構體,將點雲檔案儲存為文字檔案方便在第三方軟體如cloudCompare中檢視。但是發現客戶的結構體所佔記憶體空間跟我的
springcloud(十三):Eureka 2.X 停止開發,但註冊中心還有更多選擇:Consul 使用詳解
在上個月我們知道 Eureka 2.X 遇到困難停止開發了,但其實對國內的使用者影響甚小,一方面國內大都使用的是 Eureka 1.X 系列,另一方面 Spring Cloud 支援很多服務發現的軟體,Eureka 只是其中之一,下面是 Spring Cloud 支援的服務發現軟體以及特性對比: Fea
linux部署多個tomcat,埠修改詳解,linux埠開放訪問
一、sever.xml需要修改的地方:1、<Server port="8005" shutdown="SHUTDOWN">2、<Connector port="8080" protocol="HTTP/1.1" connectio
C語言,檔案操作詳解
在 C 語言中,檔案操作的函式大多包含在 標頭檔案中,使用時記得 #include。 一、開啟和關閉檔案 1. 開啟檔案 FILE * fopen ( const char * filename, const char * mode ); 開啟一個檔案,成功則返回
第四天:JAVA中的迴圈語句詳解,和常用例子
1:switch語句(掌握)(1)格式:switch(表示式) {case 值1:語句體1;break;case 值2:語句體2;break;...default:語句體n+1;break;}格式解釋說明:switch:說明這是switch語句。表示式:可以是byte,short,int,charJDK5以後
C++ 記憶體分配(new,operator new)詳解
在SGI STL原始碼中,defalloc.h和stl_construct.h中提供了最簡單的空間配置器(allocator)封裝,見《STL原始碼剖析》P48。它將物件的空間分配和構造分離開來,雖然在defalloc.h中僅僅是對::operator new和::operator delete的一層
c++裡面的值傳遞,指標傳遞,地址傳遞詳解
c++裡面的值傳遞: //將i和j的值傳給a和b,實參傳給形參,但由於形參不會回傳給實參,故輸出i仍為38,j仍為45 void main(){void swap(int, int);int i =