初始化信号量
int sem_init(sem_t *sem, int pshared, unsigned int value);
sem | 信号量指针 |
pshared | pshared的值为0,则表示线程间通信 非0表示进程间通信 |
value | 信号量初值 |
申请资源(P操作)和释放资源(V操作)
P操作:当信号量的值大于0时,P操作一次,申请到资源,信号量减1,当信号量的值为0时,P操作堵塞等待资源;
V操作:不会堵塞,如果任务等待资源,V操作一次唤醒第一个任务让其继续运行,如果没有任务等待资源,V操作一次信号量加1;
int sem_wait(sem_t *sem);//p操作
int sem_post(sem_t *sem);//v操作
从键盘上输入,实现读写同步
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <semaphore.h>
#include <string.h>
#define SIZE 128
char buf[SIZE];
sem_t semr;//信号量,可读资源数
sem_t semw;//可写资源数
void *pthread_fun(void *arg)
{
while(1)
{
sem_wait(&semr);//P操作
printf("You enter %ld character\n",strlen(buf));
sem_post(&semw);//V 操作
}
}
int main(int argc,char *argv[])
{
pthread_t tid;
int arg = 123;
if(sem_init(&semr,0,0) == -1)//初始化信号量
{
perror("sem_init");
return -1;
}
if(sem_init(&semw,0,1) == -1)//初始化信号量
{
perror("sem_init");
return -1;
}
int ret = pthread_create(&tid,NULL,pthread_fun,&arg);//创建子线程
if(0 != ret)
{
perror("pthread_create");
return -1;
}
do{
sem_wait(&semw);
fgets(buf,sizeof(buf),stdin);//从键盘输入数据读到buf中
sem_post(&semr);
}while(strncmp(buf,"quit",4));//输入quit退出
return 0;
编译结果
w@ubuntu:~/day4$ gcc sem_init.c -lpthread
ww@ubuntu:~/day4$ ./a.out
hello
You enter 6 character
quit