1、執行緒概念
執行緒包含了表示程序內執行環境必須的資訊,其中包括程序中標識執行緒的執行緒id、一組暫存器值、棧、排程優先順序和策略、訊號遮蔽字、errno變數以及執行緒私有資料。程序的所有資訊對該程序的所有執行緒都是共享的,包括可執行的程式文字、程式的全域性記憶體和堆記憶體、棧以及檔案描述符。
2、執行緒標識
執行緒id用pthread_t資料型別表示
必須使用函式對二個執行緒id進行比較
#include
int pthread_equal(pthread_t t1, pthread_t t2);
通過pthread_self獲得自身執行緒id
#include
pthread_t pthread_self(void);
3、建立執行緒
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
當pthread_create成功返回時,由tidp指各的記憶體單元被設定為新建立執行緒的執行緒id
attr引數用於定製各種不同的執行緒屬性。
pthread 庫不是 linux 系統預設的庫,連線時需要使用靜態庫 libpthread.a,所以在使用pthread_create()建立執行緒,以及呼叫 pthread_atfork()函式建立fork處理程式時,需要鏈結該庫。
在編譯中要加 -lpthread引數
gcc thread.c -o thread -lpthread
create_thread.c
#include
#include
#include
#include
pthread_t ntid;
void printids(const char *s)
void * thr_fn(void * arg)
int main(int argc, char **argv)
printids("main thread:");
sleep(1);
exit(0);
}
4、執行緒終止
如果程序中的任一線程呼叫了exit、_exit或者_exit,那麼整個程序就會終止。
如果訊號的預設動作是終止程序,那麼把訊號傳送到執行緒會終止整個程序。
執行緒退出方式
1)執行緒只是從啟動例程中返回,返回值是執行緒的退出碼
2)執行緒可以被同一程序中的其他執行緒取消。
3)執行緒呼叫pthread_exit
#include
void pthread_exit(void *retval);
retval是乙個無型別指標,與傳給啟動例程的單個引數類似。程序中的其他執行緒可以通過呼叫pthread_join訪問到這個指標。
#include
int pthread_join(pthread_t thread, void **retval);
呼叫執行緒將一直被阻塞,直到指定的執行緒呼叫pthread_exit,從啟動例程中返回或者被取消。
獲取已終止的執行緒的退出碼
thread_exit_code.c
#include
#include
#include
#include
#include
void *thr_fn1(void *arg)
void *thr_fn2(void *arg)
int main(int argc, char **argv)
err = pthread_create(&tid2,null,thr_fn2,null);
if(err != 0)
err = pthread_join(tid1,&tret);
if(err != 0)
printf("thread 1 exit code %s\n",strerror(err));
err = pthread_join(tid2,&tret);
if(err != 0)
printf("thread 2 exit code %s\n",strerror(err));
exit(0);
}
執行緒可以通過呼叫pthread_cancel函式來請求取消同一程序中的其他執行緒。
#include
int pthread_cancel(pthread_t thread);
5、執行緒同步
互斥變數用pthread_mutex_t資料型別表示,在使用互斥變數以前,必須首先對它進行初始化。
可以把它設定為常量pthread_mutex_initalizer(只對靜態分配的互斥量)
通過呼叫pthread_mutex_init函式進行初始化。
如果動態的分配互斥量(malloc),那麼釋放記憶體前需要呼叫pthread_mutex_destroy
#include
int pthread_mutex_destroy(pthread_mutex_t *mutex);
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
pthread_mutex_t mutex = pthread_mutex_initializer;
對互斥量進行加鎖,需要呼叫pthread_mutex_lock,如果互斥量已經上鎖,呼叫執行緒將阻塞直到互斥量被解鎖。對互斥量解鎖,需要呼叫
pthread_mutex_unlock
#include
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
如果不希望被阻塞,它可以使用pthread_mutex_trylock嘗試對互斥量進行加鎖。
如果呼叫pthread_mutex_trylock時互斥量處於未鎖住狀態,那麼將鎖住互斥量,不會出現阻塞並返回0,否則失敗
讀書筆記之UNIX環境高階程式設計 11
執行緒 1.像每個程序有乙個程序id一樣,每個執行緒也有乙個執行緒id。程序id在整個系統中是唯一的,程序id相同,但執行緒id不同,執行緒id只在它所屬的程序環境有效 2.每個程序只有乙個控制線程即main執行緒 3.執行緒建立時並不能保證哪個執行緒會先執行 是新建立的執行緒還是呼叫執行緒 4.主...
《unix環境高階程式設計》筆記2
第四章 檔案和目錄 本章將描述檔案系統特徵和檔案性質 1 stat fstat和lstat函式 原型 include int stat const char restrict pathname,struct stat restrict buf int fstat int filedes,struct...
UNIX環境高階程式設計學習筆記
include include include include int main int argc,char argv err sys can t open s argv 1 while dirp readdir dp null printf s n dirp d name closedir dp ...