華清遠見嵌入式學院
講師。一、執行緒控制
上一節我們講了使用互斥量實現執行緒的同步,這裡我們介紹一下另外一種常用的方法,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...