Linux信号量
信号量:
介绍:信号量相当于多把互斥锁。
相关函数:
定义信号量:
seem_t sem;
int sem_init(sem_t *sem, int pshared, unsigned int value)函数;
函数描述:初始化信号量
函数参数:
- sem->信号量;
- pshared-:0表示线程同步,1表示进程同步;
- value:最多有几个线程操作共享数据
函数返回值:成功返回0,失败返回-1,并设置error值;
int sem_wait(sem_t *sem);
函数描述:调用该函数一次,相当于sem--,当sem=0时,引起阻塞
函数返回值:成功返回0,失败返回-1,并设置error值;
int sem_post(sem_t *sem);
函数描述:调用一次,sem++;
函数返回值:成功返回0,失败返回-1,并设置error值;
int sem_trywait(sem_t *sem);
函数描述:尝试加锁,若失败直接返回,不阻塞。
函数返回值:成功返回0,失败返回-1,并设置error值;
int sem_destroy(sem_t *sem);
函数描述:销毁
函数返回值:成功返回0,失败返回-1,并设置error值;
使用信号量实现消费者与生产者模型:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include<pthread.h>
#include <semaphore.h>
typedef struct node
{
int data;
struct node*next;
}node;
node *phead;
//定义生产者信号量
sem_t sem_pro;
//定义消费者信号量
sem_t sem_con;
void *thread_p(void *arg)
{
node*pNode=NULL;
srand(time(NULL));
while(1)
{
pNode=(node*)malloc(sizeof(node));
if(pNode==NULL)
{
printf("malloc error");
exit(-1);
}
sem_wait(&sem_pro);//sem_pro--;sem_pro=0时阻塞
pNode->data=rand()%1000;
pNode->next=phead;
printf("p:[%d]\n",pNode->data);
phead=pNode;
sem_post(&sem_con);//sem_con++;
sleep(rand()%3);
}
}
void *thread_c(void *arg)
{
node*pNode=NULL;
while(1)
{
sem_wait(&sem_con);//sem_con--;
pNode=phead;
printf("c:[%d]\n",pNode->data);
phead=phead->next;
free(pNode);
pNode=NULL;
sem_post(&sem_pro);//让sem_pro++;
sleep(rand()%3);
}
}
int main()
{
sem_init(&sem_pro,0,3);//让sem_pro初始值为3
sem_init(&sem_con,0,0);//一开始sem_con为0
pthread_t thread1;
pthread_t thread2;
int ret=pthread_create(&thread1,NULL,thread_p,NULL);
if(ret!=0)
{
printf("pthread_create error:[%s]\n",strerror(ret));
return -1;
}
ret=pthread_create(&thread2,NULL,thread_c,NULL);
if(ret!=0)
{
printf("pthread_create error:[%s]\n",strerror(ret));
return -1;
}
pthread_join(thread1,NULL);
pthread_join(thread2,NULL);
sem_destroy(&sem_pro);
sem_destroy(&sem_con);
return 0;
}
结果:
原文地址:https://blog.csdn.net/luosuss/article/details/136399998
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!