linux usleep 线程控制权_linux多线程同步—信号量
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)題。
- 上一篇: 月神的迷宫战斗力怎么提升
- 下一篇: 陇南治免疫性不孕最好的医院推荐