线程间通信

来源:互联网 发布:复活吧我的勇士java 编辑:程序博客网 时间:2024/06/10 07:38

Linux系统中的线程间通信方式主要以下几种:

 锁机制:包括互斥锁、条件变量、读写锁

   互斥锁提供了以排他方式防止数据结构被并发修改的方法。

   读写锁允许多个线程同时读共享数据,而对写操作是互斥的。

   条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。

 信号量机制(Semaphore):包括无名线程信号量和命名线程信号量

 信号机制(Signal):类似进程间的信号处理

线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。

先关参考:

Linux线程间通讯

linux线程间通信方式总结

Linux下C开发之线程间通信


一,信号量的使用:

#include<stdio.h>  #include<memory.h>  #include<pthread.h>  #include<semaphore.h>int alex=0;sem_t sem;//int alex=0;//sem_t sem;void *func00(void *a);void *func01(void *a);int main()  {      pthread_t a,b; //创建两个线程          //初始化      printf("--enter main:\n");        int ret=sem_init(&sem,0,0); if(ret!=0)    {      printf("sem init Fail\n");      return ret;    }        //线程开始工作      pthread_create(&a,NULL,func00,0);      pthread_create(&b,NULL,func01,0);      void *recycle;  //线程结束时,存放回收的数据      pthread_join(a,&recycle); //回收资源      pthread_join(b,&recycle);  //回收资源      return 0;  }  void *func00(void *a)     //发送100个数据  {      int i;    int num00 = 0;  //    int num01 = 0;    int num02 = 0;//    int sum = 0;    printf("this is func00: \n");    for(i=0;i<=100;i++)   //总共100个数据      {      num00++;    }      sem_post(&sem);        printf("num00 = %d \n",num00);        for(i=0;i<=100;i++)   //总共100个数据      {        num02++;    }    printf("num02 = %d \n",num02);    sem_wait(&sem);//    sum =     printf("leave func00! \n");    return ;  }  void *func01(void *a)    //接受数据  {    int i;int num01 = 0;sem_wait(&sem);    printf("this is func00: \n");    for(i=0;i<=100;i++)   //总共100个数据      {      num01++;    } //    sem_post(&sem);    printf("num01 = %d \n",num01);    printf("leave func01! \n");      return ;  }  


二,锁:

#include<stdio.h>  #include<memory.h>  #include<pthread.h>  int buf[1000000];  int w=0,r=0; //r是读指针,w是写指针  int size=10; //缓冲区大小  pthread_mutex_t lock; //锁  pthread_cond_t is_empty; //缓冲区是否为空  pthread_cond_t is_full;  //缓冲区是否已满  void *sender(void *a)      //发送100个数据  {      int i,j,k;      for(i=1;i<=100;i++)   //总共100个数据      {          pthread_mutex_lock(&lock);  //锁          if(w-r>size)     //检查缓存区是否已满,缓存区里的数据不能超过10个数        pthread_cond_wait(&is_full,&lock);  //满了,等待接受线程把数据取走  ,先释放锁        buf[w++]=i;  //缓冲区有空间,发送          printf("%d---> \n",i); //打印出来          pthread_cond_signal(&is_empty);  //缓冲区里至少有一个数据,读线程可以把他取走          pthread_mutex_unlock(&lock);    //解锁      }      return ;  }  void *receiver(void *a)    //接受数据  {      int x;      while(1)      {          pthread_mutex_lock(&lock);  //锁          if(r==w)     //缓冲区是否有数据  ,如果缓存区中的数据全部被读取(即写入和读取相等)        pthread_cond_wait(&is_empty,&lock);  //没有数据,等待发送线程发数据          x=buf[r++];   //有数据了,取走          if(x!=0)          printf("--->%d \n",x);  //打印出来          else          break;    //数据发送->接受完了,结束线程          pthread_cond_signal(&is_full);  //缓冲区至少还有一个空间可以让发送进程发送数据          pthread_mutex_unlock(&lock);     //解锁      }      return ;  }  int main()  {      memset(buf,0,sizeof(buf));      pthread_t a,b; //创建两个线程      //初始化      pthread_mutex_init(&lock,NULL);      pthread_cond_init(&is_full,NULL);      pthread_cond_init(&is_empty,NULL);      //线程开始工作      pthread_create(&a,NULL,sender,0);      pthread_create(&b,NULL,receiver,0);      void *recycle;  //线程结束时,存放回收的数据      pthread_join(a,&recycle); //回收资源      pthread_join(b,&recycle);  //回收资源      return 0;  }  


0 0
原创粉丝点击