真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

LINUX系統(tǒng)編程之線程

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;

}


本文標(biāo)題:LINUX系統(tǒng)編程之線程
文章URL:http://weahome.cn/article/jhoede.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部