1. 程式人生 > >操作系統多線程多進程

操作系統多線程多進程

不同的 兩種 != 單位 操作 str 不可 運行 tdi

一個多線程的簡單實現:

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; }

操作系統多線程多進程