linux usleep 线程控制权_linux多线程同步—信号量
linux多線程編程-信號量
信號量機制
鎖機制使用是有限制的,鎖只有兩種狀態,即加鎖和解鎖,對于互斥的訪問一個全局變量,這樣的方式還可以對付,但是要是對于其他的臨界資源,比如說多臺打印機等,這種方式顯然不行了。
信號量機制在操作系統里面學習的比較熟悉了,信號量是一個整數計數器,其數值表示空閑臨界資源的數量。
當有進程釋放資源時,信號量增加,表示可用資源數增加;當有進程申請到資源時,信號量減少,表示可用資源數減少。這個時候可以把鎖機制認為是0-1信號量。
關于信號量機制的函數 初始化信號量
int sem_init(sem_t * sem, int pshared, unsigned int value);
- 成功返回0,失敗返回-1;
- 參數sem:表示指向信號結構的指針。
- 參數pshared:不是0 的時候該信號量在進程間共享,否則只能在當前進程的所有線程間共享。
- 參數value:信號量的初始值。
int sem_wait(sem_t *sem); 信號量減一操作,有線程申請資源
- 成功返回0,否則返回-1
- 參數sem:指向一個信號量的指針
int sem_post(sem_t *sem);信號量加一操作,有線程釋放資源
- 成功返回0,否則返回-1
- 參數sem:指向一個信號量指針
int sem_destroy(sem_t *sem); 銷毀信號量
- 成功返回0,否則返回-1
- 參數sem:指向一個信號量的指針。
信號量來解決多線程的同步問題,程序代碼如下
#include
#include
#include
#include
#include
#include
void* ticketport1(void*);
void* ticketport2(void*);
int tickets=100;
sem_t mutex,full; //定義兩個信號量
int main()
{
int ret;
pthread_t id1,id2;
ret=sem_init(&mutex,0,1); //初始化mutex信號量為1
ret+=sem_init(&full,0,0); //初始化full信號量為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信號量進行P操作
if(tickets>0)
{
usleep(1000);
printf("thread1 sell ticket: %d",tickets--);
sem_post(&full); //full信號量進行V操作
}
else
{
sem_post(&full); //full信號量進行V操作
break;
}
}
return (void*)0;
}
void* ticketport2(void* arg)
{
while(1)
{
sem_wait(&full); //full信號量進行P操作
if(tickets>0)
{
usleep(1000);
printf("thread2 sell ticket: %d",tickets--);
sem_post(&mutex); //mutex信號量進行V操作
}
else
{
sem_post(&mutex); //mutex信號量進行V操作
break;
}
}
return (void*)0;
}
上面的sem_init函數用來初始化兩個信號量的初始化值,這里一個設為1,一個設為0,sem_wait類似于P操作,讓信號量減1,如果小于結果小 于0,線程阻塞,否則線程繼續執行,sem_post類似于V操作,提升信號量的值,加1,通過這兩個信號量之間的互相“救對方”,就可以實現這兩個線程 的同步執行
經典的生產者消費者問題,只有當生產者把資源放入存儲區,消費者才能取得
#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;
}
總結
以上是生活随笔為你收集整理的linux usleep 线程控制权_linux多线程同步—信号量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 月神的迷宫战斗力怎么提升
- 下一篇: 陇南治免疫性不孕最好的医院推荐