c 多程序程式設計

2021-10-05 01:37:58 字數 3500 閱讀 3976

執行緒的優點:

1、建立乙個新執行緒的代價要比建立乙個新程序小得多

2、與程序之間的切換相比,執行緒之間的切換需要作業系統做的工作要少很多

3、執行緒占用的資源要比程序少很多

4、能充分利用多處理器的可並行數量

5、在等待慢速i/o操作結束的同時,程式可執行其他的計算任務

6、計算密集型應用,為了能在多處理器系統上執行,將計算分解到多個執行緒中實現

7、i/o密集型應用,為了提高效能,將i/o操作重疊。執行緒可以同時等待不同的i/o操作。

執行緒的缺點

效能損失

乙個很少被外部事件阻塞的計算密集型執行緒往往無法與共它執行緒共享同乙個處理器。如果計算密集型執行緒的數量比可用的處理器多,那麼可能會有較大的效能損失,這裡的效能損失指的是增加了額外的同步和排程開銷,而可用的資源不變。

健壯性降低

編寫多執行緒需要更全面更深入的考慮,在乙個多執行緒程式裡,因時間分配上的細微偏差或者因共享了不該共享的變數而造成不良影響的可能性是很大的,換句話說執行緒之間是缺乏保護的。

缺乏訪問控制

程序是訪問控制的基本粒度,在乙個執行緒中呼叫某些os函式會對整個程序造成影響。

程式設計難度提高

編寫與除錯乙個多執行緒程式比單執行緒程式困難得多。

建立執行緒

#include pthread_create (thread, attr, start_routine, arg)
引數

描述thread

指向執行緒識別符號指標

attr

乙個不透明的屬性物件,可以被用來設定執行緒屬性。您可以指定執行緒屬性物件,也可以使用預設值 null

start_routine

執行緒執行函式起始位址,一旦執行緒被建立就會執行

arg執行函式的引數。它必須通過把引用作為指標強制轉換為 void 型別進行傳遞。如果沒有傳遞引數,則使用 null

建立執行緒成功時,函式返回 0,若返回值不為 0 則說明建立執行緒失敗。

終止執行緒

#include pthread_exit (status)
程式示例
#include // 必須的標頭檔案

#include using namespace std;

#define num_threads 5

// 執行緒的執行函式

void* say_hello(void* args)

int main()

}//等各個執行緒退出後,程序才結束,否則程序強制結束了,執行緒可能還沒反應過來;

pthread_exit(null);

}

g++ test.cpp -lpthread -o test

#linux編譯指令

#include #include #include using namespace std; 

#define num_threads 5

void *printhello(void *threadid)

int main ()

}pthread_exit(null);

}main() : 建立執行緒, 0

main() : 建立執行緒, 1

main() : 建立執行緒, 2

main() : 建立執行緒, 3

main() : 建立執行緒, hello runoob! 執行緒 id, 0

4hello runoob! 執行緒 id, hello runoob! 執行緒 id, 3

hello runoob! 執行緒 id, 1

hello runoob! 執行緒 id, 4

2

連線和分離執行緒
pthread_join (threadid, status) 

pthread_detach (threadid)

pthread_join() 子程式阻礙呼叫程式,直到指定的 threadid 執行緒終止為止。當建立乙個執行緒時,它的某個屬性會定義它是否是可連線的(joinable)或可分離的(detached)。只有建立時定義為可連線的執行緒才可以被連線。如果執行緒建立時被定義為可分離的,則它永遠也不能被連線。

#include #include #include #include using namespace std;

#define num_threads 5

void *wait(void *t)

int main ()

} // 刪除屬性,並等待其他執行緒

pthread_attr_destroy(&attr);

for( i=0; i < num_threads; i++ )

cout << "main: completed thread id :" << i ;

cout << " exiting with status :" << status << endl;

} cout << "main: program exiting." << endl;

pthread_exit(null);

}

(1) 就緒狀態:程序已獲得除cpu外的所有必要資源,只等待cpu時的狀態。乙個系統會將多個處於就緒狀態的程序排成乙個就緒佇列。

(2) 執行狀態:程序已獲cpu,正在執行。單處理機系統中,處於執行狀態的程序只乙個;多處理機系統中,有多個處於執行狀態的程序。

(3) 阻塞狀態:正在執行的程序由於某種原因而暫時無法繼續執行,便放棄處理機而處於暫停狀態,即程序執行受阻。(這種狀態又稱等待狀態或封鎖狀態)

建立程序有兩種方式,一是由作業系統建立;二是由父程序建立。作業系統建立的程序,它們之間是平等的,一般不存在資源繼承關係。而由父程序建立的程序(子程序),它們和父程序存在隸屬關係。子程序又可以建立程序,形成乙個程序家族。

fork()函式呼叫後有2個返回值,呼叫一次,返回兩次。成功呼叫fork函式後,當前程序實際上已經**為兩個程序,乙個是原來的父程序,另乙個是剛剛建立的子程序。fork()函式的2個返回值,乙個是父程序呼叫fork函式後的返回值,該返回值是剛剛建立的子程序的id;另乙個是子程序中fork函式的返回值,該返回值是0。這樣可以用返回值來區分父、子程序。

#include #include #include #include #include using namespace std;

main()

//父子程序共同執行部分

while(k>0)

}parent process is running.

child process is running.

parent process is running.

child process is running.

parent process is running.

child process is running.

parent process is running.

parent process is running.

父子程序終止的先後順序不同會產生不同的結果。

linux多程序c程式設計

多程序程式設計 今天覆習了多程序程式設計,共涉及只是大致有程序的建立於結束,退出,終止,等待,休眠,獲取程序號,執行外部的應用程式等的函式使用,還了了解程序與執行緒的區別於相同之處,在此對於pid,ppid,pigid,puid等獲取方式與相關表示就不在陳述,建立程序的兩個主要函式vfork與for...

C語言多程序程式設計

三 舉例 四 剖析 五 父子程序開始執行的位置 1 程序是程式的執行。程式是靜態的,程序是動態的。2 程序在記憶體中有三部分組成 資料段 堆疊段和 段。段 就是存放程式 的資料,如果有數個程序執行同乙個乙個程式,那麼它們就可以使用同乙個 段 段是可以共享的 堆疊段 存放的是子程式的返回位址 引數以及...

多程序程式設計

linux下乙個程序在記憶體裡有三部份的資料,就是 資料段 堆疊段 和 段 其實學過組合語言的人一定知道,一般的cpu象i386,都有上述三種段暫存器,以方便作業系統的執行。段 顧名思義,就是存放了程式 的資料,假如機器中有數個程序執行相同的乙個程式,那麼它們就可以使用同一 個 段。堆疊段存放的就是...