作業系統並沒有提供執行緒控制的相關介面,大佬分裝了一套執行緒控制介面。
執行緒裡我們用庫函式,所以說這套介面建立的執行緒是使用者態執行緒,並且這個使用者態執行緒在作業系統中對應了乙個輕量級程序。
功能:建立⼀個新的執行緒
原型 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg);
引數 thread:返回執行緒id
attr:設定執行緒的屬性,attr為null表⽰使⽤預設屬性
start_routine:是個函式位址,執行緒啟動後要執⾏的函式
arg:傳給執行緒啟動函式的引數
返回值:成功返回0;失敗返回錯誤碼
錯誤檢查
#include #include#includevoid* child_pthread(void* arg)
return null;
}int main()
while(1)
return 0;
}
程序id和執行緒id
struct task_struct ;
多執行緒的程序,⼜被稱為執行緒組,執行緒組內的每⼀個執行緒在核心之中都存在⼀個程序描述符(task_struct)與之對應。程序描述符結構體中的pid,表⾯上看對應的是程序id,其實不然,它對應的是執行緒id;程序描述符中的tgid,含義是thread group id,該值對應的是⽤戶層⾯的程序id。
現在介紹的執行緒id,不同於 pthread_t 型別的執行緒id,和程序id⼀樣,執行緒id是pid_t型別的變數,⽽且是⽤來唯⼀標識執行緒的⼀個整型變數。如何檢視⼀個執行緒的id呢?
[lyl@localhost pthread]$ ps -elf |head -1 && ps -elf |grep create_pthread |grep -v grep
uid pid ppid lwp c nlwp stime tty time cmd
lyl 3320 2240 3320 0 2 17:43 pts/0 00:00:00 ./create_pthread
lyl 3320 2240 3321 0 2 17:43 pts/0 00:00:00 ./create_pthread
每個執行緒在虛擬位址空間中都有乙份自己獨有的執行緒位址空間儲存自己的資料 ,使用者態的執行緒id,實際上是乙個虛擬位址空間的位址,執行緒位址空間的首位址。
pid(lwp) tgid(pid)
可以看出上面create_pthread程序是多執行緒的,程序id為3320,程序內有兩個執行緒,執行緒id分別為3320,3321。
linux提供了gettid系統調⽤來返回其執行緒id,可是glibc並沒有將該系統調⽤封裝起來,在開放接⼝來共程式設計師使⽤。如果確實需要獲得執行緒id,可以採⽤如下⽅法:
#include pid_t tid;
tid = syscall(sys_gettid);
執行緒id及程序位址空間布局
pthread_t pthread_self(void);
pthread_t 到底是什麼型別呢?取決於實現。對於linux目前實現的nptl實現⽽⾔,pthread_t型別的執行緒id,本質就是⼀個程序位址空間上的⼀個位址。
執行緒控制(執行緒同步 執行緒安全)
一 執行緒同步 當多個控制線程共享相同的記憶體時,需要確保每個執行緒看到一致的資料。如果當某個執行緒可以去修改變數,而其他執行緒也可以去讀取或者修改這個變數的時候,就需要對這些執行緒進行同步控制,以確保它們在訪問變數的儲存內容時不會訪問到無效的數值。同步 多程序或者多執行緒訪問臨界資源時,必須進行同...
多執行緒控制線程的等待和喚醒
最近做註冊的時候,發現同步傳送註冊郵件多了乙個耗時,就想到非同步處理郵件傳送,直接返回成功給使用者。設計了乙個執行緒,用來傳送郵件,需要傳送的時候再來喚醒就好了,但是對於沒有系統了解過多執行緒的我來說,想的太簡單了。public class mailsendthread extends thread...
執行緒建立以及執行緒控制
在linux下pcb模擬實現程序,通俗的說就是乙個大的pcb下有很多小的pcb,稱為輕量級程序。在乙個程序中有多個pcb,而這些所有的pcb共用同乙份虛擬位址空間。而這些pcb共同基層構成乙個pcb組,乙個執行緒組就為乙個程序。3.乙個執行緒是程式執行的基本單位,程序是資源排程的基本單位。執行緒是c...