线程间通信
来源:互联网 发布:复活吧我的勇士java 编辑:程序博客网 时间:2024/06/10 07:38
Linux系统中的线程间通信方式主要以下几种:
*
读写锁允许多个线程同时读共享数据,而对写操作是互斥的。
*
*
线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。
先关参考: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
- 线程同步--线程间通信
- 线程同步--线程间通信
- JAVASE线程---线程间通信
- JAVA线程-线程间通信
- 线程3:线程间通信
- 线程与线程间通信
- 线程间通信
- c#线程间通信
- VC 线程间通信
- 线程间通信 ManualResetEvent
- java 线程间通信
- android线程间通信
- VC 线程间通信
- 线程间通信方式
- QT---线程间通信
- Android线程间通信
- 线程间的通信
- linux线程间通信
- jzoj4788 序列
- 买苹果
- poj 2115 C Looooops
- CXF-01:使用CXF开发Web Service服务端
- android viewpager切换到最后一页时,跳转至其他activity
- 线程间通信
- 【幻化万千戏红尘】qianfeng-Android-Day19_导航栏制作
- C++实现单链表的逆置
- maven报错:Check $M2_HOME environment variable and mvn script match.
- 2016.09.17【初中部 NOIP提高组 】模拟赛C
- 【幻化万千戏红尘】qianfeng-Android-Day20_Bitmap二次采样
- Fresco第三方框架加载图片教程介绍
- NOIP2016提高A组模拟9.17
- 对于Java转型的一些个人理解