日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux usleep 线程控制权_linux多线程同步—信号量

發(fā)布時(shí)間:2023/12/1 linux 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux usleep 线程控制权_linux多线程同步—信号量 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

linux多線程編程-信號(hào)量

信號(hào)量機(jī)制

鎖機(jī)制使用是有限制的,鎖只有兩種狀態(tài),即加鎖和解鎖,對(duì)于互斥的訪問(wèn)一個(gè)全局變量,這樣的方式還可以對(duì)付,但是要是對(duì)于其他的臨界資源,比如說(shuō)多臺(tái)打印機(jī)等,這種方式顯然不行了。

信號(hào)量機(jī)制在操作系統(tǒng)里面學(xué)習(xí)的比較熟悉了,信號(hào)量是一個(gè)整數(shù)計(jì)數(shù)器,其數(shù)值表示空閑臨界資源的數(shù)量。

當(dāng)有進(jìn)程釋放資源時(shí),信號(hào)量增加,表示可用資源數(shù)增加;當(dāng)有進(jìn)程申請(qǐng)到資源時(shí),信號(hào)量減少,表示可用資源數(shù)減少。這個(gè)時(shí)候可以把鎖機(jī)制認(rèn)為是0-1信號(hào)量。

關(guān)于信號(hào)量機(jī)制的函數(shù) 初始化信號(hào)量

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

- 成功返回0,失敗返回-1;

- 參數(shù)sem:表示指向信號(hào)結(jié)構(gòu)的指針。

- 參數(shù)pshared:不是0 的時(shí)候該信號(hào)量在進(jìn)程間共享,否則只能在當(dāng)前進(jìn)程的所有線程間共享。

- 參數(shù)value:信號(hào)量的初始值。

int sem_wait(sem_t *sem); 信號(hào)量減一操作,有線程申請(qǐng)資源

- 成功返回0,否則返回-1

- 參數(shù)sem:指向一個(gè)信號(hào)量的指針

int sem_post(sem_t *sem);信號(hào)量加一操作,有線程釋放資源

- 成功返回0,否則返回-1

- 參數(shù)sem:指向一個(gè)信號(hào)量指針

int sem_destroy(sem_t *sem); 銷毀信號(hào)量

- 成功返回0,否則返回-1

- 參數(shù)sem:指向一個(gè)信號(hào)量的指針。

信號(hào)量來(lái)解決多線程的同步問(wèn)題,程序代碼如下

#include

#include

#include

#include

#include

#include

void* ticketport1(void*);

void* ticketport2(void*);

int tickets=100;

sem_t mutex,full; //定義兩個(gè)信號(hào)量

int main()

{

int ret;

pthread_t id1,id2;

ret=sem_init(&mutex,0,1); //初始化mutex信號(hào)量為1

ret+=sem_init(&full,0,0); //初始化full信號(hào)量為0

if(ret!=0)

{

perror("sem_init");

}

ret=pthread_create(&id1,NULL,ticketport1,NULL);

if(ret<0)

{

perror("creat thread1:");

exit(-1);

}

ret=pthread_create(&id2,NULL,ticketport2,NULL);

if(ret<0)

{

perror("creat thread2:");

exit(-1);

}

pthread_join(id1,NULL);

pthread_join(id2,NULL);

return 0;

}

void* ticketport1(void* arg)

{

while(1)

{

sem_wait(&mutex); //mutex信號(hào)量進(jìn)行P操作

if(tickets>0)

{

usleep(1000);

printf("thread1 sell ticket: %d",tickets--);

sem_post(&full); //full信號(hào)量進(jìn)行V操作

}

else

{

sem_post(&full); //full信號(hào)量進(jìn)行V操作

break;

}

}

return (void*)0;

}

void* ticketport2(void* arg)

{

while(1)

{

sem_wait(&full); //full信號(hào)量進(jìn)行P操作

if(tickets>0)

{

usleep(1000);

printf("thread2 sell ticket: %d",tickets--);

sem_post(&mutex); //mutex信號(hào)量進(jìn)行V操作

}

else

{

sem_post(&mutex); //mutex信號(hào)量進(jìn)行V操作

break;

}

}

return (void*)0;

}

上面的sem_init函數(shù)用來(lái)初始化兩個(gè)信號(hào)量的初始化值,這里一個(gè)設(shè)為1,一個(gè)設(shè)為0,sem_wait類似于P操作,讓信號(hào)量減1,如果小于結(jié)果小 于0,線程阻塞,否則線程繼續(xù)執(zhí)行,sem_post類似于V操作,提升信號(hào)量的值,加1,通過(guò)這兩個(gè)信號(hào)量之間的互相“救對(duì)方”,就可以實(shí)現(xiàn)這兩個(gè)線程 的同步執(zhí)行

經(jīng)典的生產(chǎn)者消費(fèi)者問(wèn)題,只有當(dāng)生產(chǎn)者把資源放入存儲(chǔ)區(qū),消費(fèi)者才能取得

#include

#include

#include

#include

#define MAXSIZE 10

int stack[MAXSIZE];

int size =0;

sem_t sem;

void privide_data(void)

{

int i;

for(i =0;i

{

stack[i] = i;

sem_post(&sem);

}

}

void handle_data(void)

{

int i;

while((i = size ++)

{

sem_wait(&sem);

printf("cross : %d X %d = %d ",stack[i],stack[i],stack[i] * stack[i]);

sleep(1);

}

}

int main()

{

pthread_t privider,handler;

sem_init(&sem,0,0);

pthread_create(&privider,NULL,(void *)&privide_data,NULL);

pthread_create(&handler,NULL,(void *)&handle_data,NULL);

pthread_join(privider,NULL);

pthread_join(handler,NULL);

sem_destroy(&sem);

return 0;

}

總結(jié)

以上是生活随笔為你收集整理的linux usleep 线程控制权_linux多线程同步—信号量的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。