在傳統的unix程序模型中,每個程序只有乙個控制線程。從概念上講,這與基於執行緒的模型中只包含乙個執行緒是相同的。在posix執行緒(pthread)的情況下,程式開始執行時,它也是以單程序中的單個控制線程啟動的,在建立多個控制線程以前,程式的行為與傳統的程序並沒有什麼區別。新增的執行緒可以通過呼叫pthread_create函式建立。
#include int pthread_create(pthread_t *restrict tidp,當pthread_create成功返回時,由tidp指向的記憶體單元被設定為新建立的執行緒的執行緒id。attr引數用於定製各種不同的執行緒屬性。執行緒屬性在以後介紹,眼下暫時把它設定為null,建立預設屬性的執行緒。const pthread_attr_t *restrict attr,
void *(*start_rtn)(void *), void *restrict arg);
返回值:若成功則返回0,否則返回錯誤編號
新建立的執行緒從start_rtn函式的位址開始執行,該函式只有乙個無型別指標引數arg,如果需要向start_rtn函式傳遞的引數不止乙個,那麼需要把這些引數放到乙個結構中,然後把這個結構的位址作為arg引數傳入。
例項
雖然沒有可移植的方法列印執行緒id,但是可以寫乙個小的測試程式來完成這個任務,以便更深入地了解執行緒是如何工作的。程式清單11-1中建立了乙個執行緒並且列印程序id、新執行緒的執行緒id以及初始執行緒的執行緒id。
程式清單11-1 列印執行緒id
#include "編譯上面程式過程中遇到了undefined reference to 『pthread_create』的問題:apue.h
"#include
pthread_t ntid;
void
printids(
const
char *s)
void *thr_fn(
void *arg)
intmain(
void
)
首先,檢查了函式名,沒有寫錯;然後檢查了標頭檔案,也包含了。這種摸不著頭腦的問題總是讓人很糾結的......最終在網上找到了出現該問題的原因及其解決方案,參考自:
問題原因:
pthread 庫不是 linux 系統預設的庫,連線時需要使用靜態庫 libpthread.a,所以在使用pthread_create()建立執行緒,以及呼叫 pthread_atfork()函式建立fork處理程式時,需要鏈結該庫。
解決方案:
在編譯中要加 -lpthread引數
問題解決了就ok了嗎?當然不行,由此問題恰好暴露了之前學過的一些知識其實並沒有真正吃透,學的時候理解,遇到問題的時候卻想不起來。其實上面出現的這個問題牽涉到了之前學過的如下兩個知識點:
(1)軟體開發工具gcc
。注意其中的gcc鏈結選項部分。
(2)unix標準化及實現之posix標準可選標頭檔案
。從中可以看到pthread.h是posix標準的可選標頭檔案,也就是說pthread庫不是linux系統預設的庫,鏈結時需要使用靜態庫libpthread.a。
更多關於undefined reference to...的問題可參考:
現在我們言歸正傳,從程式清單11-1執行結果來看,兩個執行緒的程序id相同,但執行緒id不同。不過這不是絕對的,依賴於具體的實現。
這個例項有兩個需要注意的地方:
(1)需要處理主線程和新執行緒之間的競爭。首先是主線程需要休眠,如果主線程不休眠,它就可能退出,這樣在新執行緒有機會執行之前整個程序可能就已經終止了。這種行為特徵依賴於作業系統中的執行緒實現和排程演算法。
(2)新執行緒是通過呼叫pthread_self函式獲取自己的執行緒id,而不是從共享記憶體中讀出或者從執行緒的啟動例程中以引數的形式接收到。回憶pthread_create函式,它會通過第乙個引數(tidp)返回新建執行緒的執行緒id。在本例中,主線程把新執行緒id存放在ntid中,但是新建的執行緒並不能安全地使用它,如果新執行緒在主線程呼叫pthread_create返回之前就執行了,那麼新執行緒看到的是未經初始化的ntid的內容,這個內容並不是正確的執行緒id。
本篇博文內容摘自《unix環境高階程式設計》(第二版),僅作個人學習記錄所用。關於本書可參考:。
管理執行緒之建立執行緒
基本的執行緒管理包括 1 建立執行緒。2 等待它結束或在後台執行。3 向執行緒函式傳遞引數,更改執行緒物件所有權。4 選擇執行緒和使用特定執行緒。void do some work std thread my thread do some work 這是最簡單的情況,std thread還可以使用可...
多執行緒之執行緒池的建立
多執行緒計算的出現大大提高了程式的處理效能.但是過多的執行緒一定會帶來執行緒資源排程的損耗 如建立和 執行緒 這樣就會導致程式的響應速度.為了實現合理的執行緒操作.就需要提高執行緒的可管理性.並降低資源損耗.所在在juc中提出了執行緒池的概念,執行緒池的建立可以通過executors類完成.一 ex...
多執行緒之建立執行緒的方式
繼承thread類 1.新建乙個執行緒類繼承thread類 2.重寫run 3.在main方法中例項化執行緒物件 4.呼叫start public class thread01 class mythread extends thread 實現runnable介面 1.建立執行緒類並實現runnabl...