Linux學習(二十一) 執行緒

2021-08-08 19:23:01 字數 3333 閱讀 5926

每個程序都有自己單獨的位址空間,這樣在程序切換的時候開銷就會比較大,為了提高系統的效能,許多作業系統規範裡引入了輕量級程序的概念,也被稱為執行緒。

在同乙個程序中建立的執行緒共享該程序的位址空間。

函式原型:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,

void *(*start_routine) (void *), void *arg);

功能描述:建立乙個執行緒

引數:thread:執行緒pid

attr:執行緒屬性,一般我們選擇使用預設情況,設定為null

start_routine:函式指標,執行緒的執行函式

arg:傳遞給執行緒執行函式的引數

返回值:成功返回0,錯誤返回不為0

執行緒的退出有以下幾種情況:

(1)呼叫pthread_exit()

(2)start_routine函式執行結束

(3)呼叫exit函式

(4)呼叫pthread_cancel取消執行緒

(5)建立它的main程式執行完畢退出了

函式原型:void pthread_exit(void *retval);

功能描述:執行緒退出

引數:執行緒退出時的返回值 ,可以與pthread_join配合使用

返回值:無

函式原型:int pthread_join(pthread_t thread, void **retval);

功能描述:等待執行緒結束

引數:thread,執行緒id

retval,pthread_exit的返回引數

返回值:成功返回0,失敗返回非0

3.1、同步與互斥

多執行緒共享同乙個程序的位址空間,這樣有個好處就是執行緒間通訊很容易,使用全域性變數即可,但另乙個方面,

多個執行緒同時訪問共享物件時需要引入同步和互斥機制。

3.2、互斥鎖的初始化

函式原型:int pthread_mutex_init(pthread_mutex_t *restrict mutex,

const pthread_mutexattr_t *restrict attr);

功能描述:初始化乙個互斥鎖

引數:mutex:互斥鎖id

attr:互斥鎖屬性,一般使用預設,直接設定為null

返回值:成功返回0,失敗返回非0值

函式原型:int pthread_mutex_lock(pthread_mutex_t *mutex);

功能描述:互斥鎖上鎖

引數:mutex 互斥鎖id

返回值:成功返回0,失敗返回非0值

函式原型:int pthread_mutex_unlock(pthread_mutex_t *mutex);

功能描述:互斥鎖解鎖

引數:mutex 互斥鎖id

返回值:成功返回0,失敗返回非0值

對於訊號量,我們可以用停車場外面指示牌簡單模擬一下,停車場是乙個公用的資源,但能停的車是有限的,比如乙個停車場最多可以停10輛車;停車場的指示牌最初顯示是10,這是車輛可以進入停車場,每次進一輛指示牌就減一,當指示牌顯示為0的時候,外面的車就不能再進入停車場,也就是不能占用這項資源。但此時如果有停車場內的車出來了,指示牌就可以加1,停車場這個資源又可以使用了。

函式原型:int sem_init(sem_t *sem, int pshared, unsigned int value);

功能描述:初始化乙個訊號量

引數:sem:儲存訊號量id的變數

pshared:0為執行緒間使用,1為程序間使用

value:訊號量初始值

返回值:成功返回0,失敗返回-1

函式原型:    int sem_wait(sem_t *sem);

int sem_trywait(sem_t *sem);

int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);

功能描述:(1)等待訊號量,訊號量為0就一直等待,直到訊號量大於0

(2)嘗試等待訊號量,大於0繼續執行,等於0直接返回錯誤

(3)等待訊號量,大於0繼續執行,等於0等待abs_timeout設定時間,時間到仍等於0,返回錯誤信   息

引數:sem:訊號量id

abs_timeout:設定等待時間

struct timespec ;

返回值:訊號量大於0時返回值為0,否則返回值為-1,用errno只是錯誤。

函式原型: int sem_post(sem_t *sem);

功能描述:釋放訊號量,訊號量執行加1操作

引數:sem 訊號量id

返回值:成功返回0,失敗返回-1

從終端出入字串,再從終端列印出該字串

/*無名訊號量:乙個動作的需要另乙個動作的完成才執行*/

#include #include #include #if 0

int sem_destroy(sem_t *sem);

功能:銷毀乙個訊號量

int sem_init(sem_t *sem, int pshared, unsigned int value);

功能:初始化乙個訊號量

引數:sem :要初始化的訊號量

pshared:為0代表用於多執行緒間

value :訊號量的初始值

int sem_post(sem_t *sem);

功能:v操作,增加乙個訊號量

int sem_wait(sem_t *sem);

功能:p操作,減少乙個訊號量

特點:>0:執行減一操作

=0:阻塞等待產生新的訊號量

#endif

char buf[32] = "begin\n";

sem_t sem;

void *fun1(void *arg)

pthread_exit(null);

}void *fun2(void *arg)

pthread_exit(null);

}int main(int argc, const char *argv)

if(pthread_create(&pthid2, null, fun2, null) != 0)

//等待指定執行緒的退出

pthread_join(pthid1, null);

pthread_join(pthid2, null);

//銷毀訊號量

sem_destroy(&sem);

return 0;

}

Linux(二十一)Shell程式設計

完成資料庫的定時備份。備份的路徑 backup data backup db 當前的時間作為檔名 datetime date y m d h m s 可以輸出變數除錯 echo echo 開始備份 echo 備份的路徑是 backup datetime.tar.gz 主機host localhost...

python 學習筆記(二十一)

coding utf8 author liwei windows平台多程序匯入multiprocessing模組 from multiprocessing import process,queue from multiprocessing import pool import os,time,ran...

Linux學習筆記(二十一 輸出重定向)

裝置 裝置檔名 檔案描述符 型別鍵盤 dev stdin 0標準輸入 顯示器 dev sdtout 1標準輸出 顯示器 dev sdterr 2標準錯誤輸出 型別符號 作用標準輸出重定向 命令 檔案 以覆蓋的方式把命令的正確輸出輸出到指定的檔案或裝置當中 標準輸出重定向 命令 檔案 以追加的方式,把...