线程间同步PV操作

来源:互联网 发布:java登录界面 编辑:程序博客网 时间:2024/05/16 09:10

1.同步(synchronization)指的是多个任务(线程)按照约定的顺序相互配合完成一件事情
2.由信号量来决定线程是继续运行还是阻塞等待
3.信号量代表一类资源,其值表示系统中该资源的数量
4.信号量是一个爱保护的变量,只能通过三种操作来访问,初始化,P操作(消费者)V操作(生产者)
5.信号量的值为非负整数
所用函数
sem_init();
sem_wait();
sem_post();
pthread_create();
pthread_join();
--------------------------------------------------------------------------------------
common.h
--------------------------------------------------------------------------------------
#ifndef _COMMON_H
#define _COMMON_H
 #include<stdio.h>
 #include<stdlib.h>
 #include<pthread.h>
 #include<semaphore.h>
extern void pthread_function1(void *arg);
extern void pthread_function2(void *arg);
#endif
--------------------------------------------------------------------------------------
sem_syn.c
---------------------------------------------------------------------------------------
#include"common.h"
int gval;
int i;
sem_t sem1,sem2;
int main(int argc,char **argv)
{
 pthread_t th1,th2;
 sem_init(&sem1,0,1);
 sem_init(&sem2,0,0);
 pthread_create(&th1,NULL,(void *)pthread_function1,NULL);
 pthread_create(&th2,NULL,(void *)pthread_function2,NULL);
 pthread_join(th1,NULL);
 pthread_join(th2,NULL);
 return 0;
}
void pthread_function1(void *arg)
{
 for(i=0;i<5;i++)
 {
  sem_wait(&sem1);
  gval++;
  sem_post(&sem2);
  printf("pthread1 NO.%d=%d/n",i,gval);
 }
}
void pthread_function2(void *arg)
{
 for(i=0;i<5;i++)
 {
  sem_wait(&sem2);
  gval=gval+2;
  sem_post(&sem1);
  printf("pthread2 NO.%d=%d/n",i,gval);
 }
}
----------------------------------------------------------------------------------------
结果:
[root@localhost sem_syn]# ./s
pthread1 NO.0=1
pthread2 NO.0=3
pthread1 NO.1=4
pthread2 NO.2=6
pthread1 NO.3=7
pthread2 NO.4=9
pthread1 NO.5=10
----------------------------------------------------------------------------------------
线程1运行加1,然后线程2运行加2交替运行

原创粉丝点击