操作系統多線程多進程
一個多線程的簡單實現:
https://blog.csdn.net/sujianwei1123/article/details/76183682
sleep函數:執行掛起一段時間,也就是等待一段時間在繼續執行。秒級別。
exit函數講解:https://blog.csdn.net/love_gaohz/article/details/46667007 當進程執行到exit()或_exit()函數時,進程會無條件的停止剩下的所有操作,清除各種數據結構,並終止本進程的運行。每個exit函數也只關閉相對應的進程。
在操作系統的基本概念中進程是程序的一次執行,且是擁有資源的最小單位和調度單位(在引入線程的操作系統中,線程是最小的調度單位)。在Linux系統中創建進程有兩種方式:一是由操作系統創建,二是由父進程創建進程(通常為子進程)。系統調用函數fork()是創建一個新進程的唯一方式,當然vfork()也可以創建進程,但是實際上其還是調用了fork()函數。fork()函數是Linux系統中一個比較特殊的函數,其一次調用會有兩個返回值,下面是fork()函數的聲明:
當程序調用fork()函數並返回成功之後,程序就將變成兩個進程,調用fork()者為父進程,後來生成者為子進程。這兩個進程將執行相同的程序文本,但卻各自擁有不同的棧段、數據段以及堆棧拷貝。子進程的棧、數據以及棧段開始時是父進程內存相應各部分的完全拷貝,因此它們互不影響。從性能方面考慮,父進程到子進程的數據拷貝並不是創建時就拷貝了的,而是采用了寫時拷貝(copy-on -write)技術來處理。調用fork()之後,父進程與子進程的執行順序是我們無法確定的(即調度進程使用CPU),意識到這一點極為重要,因為在一些設計不好的程序中會導致資源競爭,從而出現不可預知的問題。
註意:for循環生成了5個pid,再加上父進程就是6個進程。剛開始以為for循環進程的生成,後面的pid會覆蓋掉前面的pid,以為就生成了一個子進程,事實是生成5個子進程,不會覆蓋
個人理解其實就是通過pid的編號來實現控制不同的進程的運行和終止。
#include<stdio.h> #include<unistd.h> #include <sys/types.h> #include<vector> #include <iostream> #include <stdlib.h> 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; }
操作系統多線程多進程