LINUX系統(tǒng)編程之線程
創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的洛南網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
情景:
在雙核虛擬機中有兩個線程函數(shù)執(zhí)行以下功能:
線程一:printf("hello\n");
線程二:printf("world\n");
程序運行時在單核狀態(tài)下和雙核狀態(tài)下兩個線程的執(zhí)行順序不一樣,請問它們是根據(jù)怎樣的規(guī)則進行調(diào)度的?
進程擁有自己的數(shù)據(jù)段,代碼段,堆棧,占用資源多,開銷大,通信不方便
為了減少系統(tǒng)開銷,從進程中演化出了線程
線程存在于進程中,使用進程的資源
一、概述
線程是CPU調(diào)度和分配的基本單位,存在于進程中,是進程中的獨立控制流
進程是系統(tǒng)中程序執(zhí)行和資源分配的基本單位
線程自己不擁有資源
進程默認(rèn)有一個控制線程(主線程)
線程依賴于進程存在,進程結(jié)束線程也結(jié)束
線程占用空間少
目的:
多任務(wù)程序設(shè)計
并發(fā)程序設(shè)計
網(wǎng)絡(luò)程序
數(shù)據(jù)共享
多CPU并行
二、操作
void *fun(void *arg)
注意線程函數(shù)參數(shù)和返回值類型
pthread_t pth;
創(chuàng)建線程pthread_create(&pth, NULL, fun, (void *)arg);(可用結(jié)構(gòu)體或數(shù)組傳遞多個參數(shù))
等待線程結(jié)束回收其資源pthread_join(pth, NULL);
分離線程pthread_detach(pth);
退出線程pthread_exit();
取消線程pthread_cancle();
取消狀態(tài)pthread_setcancelstate();
取消類型pthread_setcanceltype();
設(shè)置取消點pthread_testcancel();
清理pthread_cleanup_push();pthread_cleanup_pop();兩個函數(shù)必須成對存在
編譯gcc a.c 加-lpthread
gtk編程中多個線程可能使用同一資源照成界面凍結(jié),所以要線程互斥
可使用gtk_threads_enter();和gtk_threads_leave();實現(xiàn)
三、線程的同步和互斥
互斥:多個任務(wù)訪問同一公共資源,同一時刻只有一個任務(wù)可以訪問
互斥鎖和信號量
1.互斥鎖:mutex,上鎖解鎖兩種狀態(tài),解鎖必須由上鎖者完成
申請mutex,如果lock則阻塞申請者
pthread_mutex_t mutex;
pthread_mutex_lock(&mutex);
pthread_mutex_trylock(&mutex);
pthread_mutex_unlock(&mutex);
pthread_mutex_destroy(&mutex);
2.信號量
非負的整數(shù)計數(shù)器
對信號量進行減操作,如果為0則阻塞
PV原語,P減,V加
sem_t sem;
sem_init(&sem, 0, 1);
sem_wait(&sem);sem_trywait(&sem);
sem_post(&sem);
int val;
sem_getvalue(&sem, &val);
sem_destroy(&sem);
通過信號量同步操作實現(xiàn)多任務(wù)之間按照順序運行
線程:無名信號量,進程:有名信號量
一個任務(wù)一個信號量
有名信號量
sem_t *sem_open("sem", O_RDWR);
sem_close(sem);
sem_unlink("sem");
有名信號量的名字在程序中和文件系統(tǒng)中不一樣
有名信號量會保存之前的值所以使用前應(yīng)該先刪除再創(chuàng)建
實例:
有一個倉庫生產(chǎn)者負責(zé)生產(chǎn)產(chǎn)品,并放入倉庫,消費者從倉庫拿走產(chǎn)品
要求倉
庫每次只能入一人
倉庫中最多存放10個產(chǎn)品,倉庫滿時不能再放入產(chǎn)品
倉庫空時不能再從中取出產(chǎn)品
生產(chǎn)消費速度不同
思路:
生產(chǎn)和消費各一個線程,倉庫為互斥,假設(shè)容量為10,庫存為3
假設(shè)生產(chǎn)速度比消費速度快
信號量的值等于剩余產(chǎn)品
#include
#include
#include
#include
int total=10;//總量
int last=7;//剩余量
sem_t sem_p;
sem_t sem_c;
void *produce(void *arg)
{
//sem_t *temp_semp=(sem_t *)arg;
while(1)
{
// sem_p=total-last;
if(9 >= last)
{
sleep(2);
sem_wait(&sem_p);
last++;
printf("in!last=%d\n",last);
sem_post(&sem_c);
}
}
}
void *cost(void *arg)
{
//sem_t *temp_semp=(sem_t *)arg;
while(1)
{
// sem_c=last;
if(1 <= last)
{
sem_wait(&sem_c);
last--;
printf("out!last=%d\n",last);
sem_post(&sem_p);
sleep(3);
}
}
}
int main()
{
pthread_t pth_p,pth_c;
sem_init(&sem_p,0,total-last);
sem_init(&sem_c,0,last);
printf("init_last=%d\n",last);
pthread_create(&pth_p,NULL,produce,NULL);
pthread_create(&pth_c,NULL,cost,NULL);
while(1);
return 0;
}