Unix環境高階程式設計筆記 11 執行緒

2021-08-27 15:35:52 字數 3137 閱讀 2377

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 ...