執行緒解析 四

2021-05-13 02:29:05 字數 2350 閱讀 8740

華清遠見嵌入式學院

講師。一、執行緒控制

上一節我們講了使用互斥量實現執行緒的同步,這裡我們介紹一下另外一種常用的方法,posix提供的無名訊號量sem,pv原語是對整數計數器訊號量sem的操作,p操作判斷sem資源數是否為0,不為0則進行p操作,一次p操作可使sem減一,而一次v操作可使sem加一。下面是posix提供的一些介面函式:

1、訊號量初始化

#include

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

函式引數:

sem:訊號量

pshared:乙個引數一般為0,表示同乙個程序中的執行緒共享乙個訊號量。

value:訊號量資源個數

2、其餘函式

int sem_wait (sem_t* sem);

int sem_trywait (sem_t* sem);

int sem_post (sem_t* sem);

int sem_getvalue (sem_t* sem);

int sem_destroy (sem_t* sem);

sem_wait和sem_trywait相當於p操作,它們都能將訊號量的值減一,兩者的區別在於若訊號量的值小於零時,sem_wait將會阻塞程序,而sem_trywait則會立即返回。

sem_post相當於v操作,它將訊號量的值加一,同時發出喚醒的訊號給等待的程序(或執行緒)。

sem_getvalue 得到訊號量的值。

sem_destroy 摧毀訊號量。

下面用乙個例程說明訊號量的使用:

#include

#include

#include

#include

#include

#include

sem_t sem;

pid_t gettid(void)

void *thread_a(void *arg)

void *thread_b(void *arg)

int main(int argc, char **argv)

err = pthread_create(&tid_b,null,thread_b,null);

if(err < 0)

sleep(30);

sem_destroy(&sem);

printf("the main close/n");

return 0;

}二、posix tid和linux tid

前面我們說建立執行緒的時候提到乙個函式pthread_self,這個函式使posix執行緒庫中的乙個函式,通過這個函式可以獲得執行緒的id,可是我們列印出來這個id會發現這個id是乙個很大的數字。沒有得到我們想象的乙個數字,其實這個id是posix執行緒庫提供的乙個數字,而linux核心中也為這個執行緒提供了乙個id,這個id可以通過gettid獲得,gettid是linux核心提供的乙個系統呼叫,glibc沒有封裝函式,只能通過系統呼叫實現。

posix:

#include

pthread_t pthread_self(void);

linux系統呼叫:

#include

#include

pid_t gettid(void)

下面我們通過乙個例程看下這兩個函式的區別。

#include

#include

#include

#include

#include

pid_t gettid(void)

void *thread_a(void *arg)

void *thread_b(void *arg)

int main(int argc, char **argv)

err = pthread_create(&tid_b,null,thread_b,null);

if(err < 0)

sleep(5);

printf("the main close/n");

return 0;

}程式執行結果:

thread a enter

pid = 3b89, posix_tid = b7fd4b90, linux_tid = 3b8a

thread b enter

pid = 3b89, posix_tid = b75d3b90, linux_tid = 3b8b

the main close

通過這個函式我們可以發現posix提供的這個id不是很有規律,而linux核心為執行緒提供的id是經跟在主程序程序號的數字,如上面程式中主程序id為3b89而兩個執行緒的id分別為3b8a,3b8b。

四種常用執行緒池解析

我們從原始碼來分析一下四種常見的執行緒池,我們常見的四種執行緒池分別為newcachedthreadpool newfixedthreadpool newsinglethreadexecutor newschedulethreadpool。這四種執行緒池本質上也是threadpoolexecutor...

POSIX執行緒 (四)

使用互斥同步 在多執行緒程式中同步訪問的另乙個方法就是使用互斥,其作用允許程式鎖住乙個物件,從而只有乙個執行緒可以訪問他。要控制對臨界區 的訪問,在我們進入這段 之前鎖住乙個互斥量,並且在我們完成操作時進行解鎖。使用互斥所需要基本函式與訊號量所需要的函式相似,其宣告如下 include int pt...

POSIX執行緒 (四)

使用互斥同步 在多執行緒程式中同步訪問的另乙個方法就是使用互斥,其作用允許程式鎖住乙個物件,從而只有乙個執行緒可以訪問他。要控制對臨界區 的訪問,在我們進入這段 之前鎖住乙個互斥量,並且在我們完成操作時進行解鎖。使用互斥所需要基本函式與訊號量所需要的函式相似,其宣告如下 include int pt...