同步
是指多个任务按照约定的先后次序 相互配合完成一件事情
信号量:
由信号量决定 线程是继续执行 还是阻塞等待
信号量代表某种资源 其值表示系统中该资源的数量
信号量是一个受保护的量 只能通过特定的三种操作来访问
初始化
P操作(申请资源, 有可能阻塞)
V操作(释放资源, 不会阻塞)
P(s)操作 :
if(信号量的值大于0 )
申请资源的任务继续执行 信号量-1
else
申请资源的任务阻塞·
V(s)操作 :
信号量+1
if(有任务在等待资源 )
唤醒等待任务 让其继续执行
Posix信号量
内部定义了两类信号量:
无名信号量 (基于内存的信号量 主要用于线程间的同步 也可以用于进程之间
但是不方便)
有名信号量(既可以用于进程 也可以用于线程)
信号量操作函数:
#include<semaphore.h>
int sem_init(sem_t *sem, int pshared,unsigned int vaule) // 信号量初始化
成功返回0 失败返回EOF
sem 指向要初始化的信号量对象
pshared 0 - 线程间 1 - 进程间
val 信号量初值
同文件同上
int sem_wait(sem_t *sem); //P操作
int sem_post(sem_t *sem); //V操作
成功返回0 失败返回EOF
sem 指向要操作的信号量对象
Ps: 两个线程同步读写缓冲区
char buf[32];
sem_t sem;
void *function(void *arg);
int main(void)
{
pthread_t a_thread;
if(sem_init(&sem,0, 0) < 0)
{
perror("sem_init");
exit(-1);
}
if(pthread_create(&a_thread, NULL, function, NULL) != 0)
{
printf("fila to pthread_create");
exit(-1);
}
printf("input 'quit' to exit\n");
do{
fgets(buf, 32, stdin);
sem_post(&sem);
}while(strncmp(buf, "quit", 4) != 0);
return 0;
}
void *function(void *arg)
{
while(1)
{
sen_wait(&sem);
printf("you enter %d characters\n", strlen(buf));
}
}
Ps: l两个线程同步读写
char buf[32];
sem_t sem_r, sem_w;
void *function(void *arg);
int main(void)
{
pthread_t a_thread;
if(sem_init(&sem_r,0, 0) < 0)
{
perror("sem_init");
exit(-1);
}
if(sem_init(&sem_w,0, 0) < 0)
{
perror("sem_init");
exit(-1);
}
if(pthread_create(&a_thread, NULL, function, NULL) != 0)
{
printf("fila to pthread_create");
exit(-1);
}
printf("input 'quit' to exit\n");
do{
sem_post(&sem_w);
fgets(buf, 32, stdin);
sem_wait(&sem_r);
}while(strncmp(buf, "quit", 4) != 0);
return 0;
}
void *function(void *arg)
{
while(1)
{
sen_wait(&sem_r);
printf("you enter %d characters\n", strlen(buf));
sen_post(&sem_w);
}
}
命令: gcc -o test test.c -lpthread