#include
#include
#include
intbuf[1000000];
intw=0,r=0;//r是读指针,w是写指针
intsize=10;//缓冲区大小
pthread_mutex_tlock;//锁
pthread_cond_tis_empty;//缓冲区是否为空
pthread_cond_tis_full;//缓冲区是否已满
void*sender(void*a)//发送100个数据
{
inti,j,k;
for(i=1;i
{
pthread_mutex_lock(&lock);//锁
if(w-r>size)//缓冲区是否已满
缺点是如果unlock和pthread_cond_signal之间,有个低优先级的线程正在mutex上等待的话,那么这个低优先级的线程就会抢占高优先级的线程(调用pthread_cond_wait的线程),而这在上面的放中间的模式下是不会出现的。缺点是如果unlock和pthread_cond_signal之间,有个低优先级的线程正在mutex上等待的话,那么这个低优先级的线程就会抢占高优先级的线程 (调用pthread_cond_wait的线程)linux 多线程通信,而这在上面的放中间的模式下是不会出现的。mutex互斥锁必须是普通锁(pthread_mutex_timed_np)或者适应锁 (pthread_mutex_adaptive_np),且在调用pthread_cond_wait()前必须由本线程加锁 (pthread_mutex_lock()),而在更新条件等待队列以前,mutex保持锁定状态,并程挂起进入等待前解锁。
buf[w++]=i;//缓冲区有空间,发送
printf("%d--->/n",i);//打印出来
读线程从共享资源中读数据,同时写线程需要向共享资源中写数据linux 多线程通信,当多个读、写线程共用一个资源(缓冲区)的时候,据需要使用诸如critical section或者互斥量的排他性锁(独占锁)来控制资源的访问,但是针对读操作较为频繁,写操作相对较少的情况下,使用独占锁是很不划算的,需要耗费更多的时间和其他资源。读线程从共享资源中读数据,同时写线程需要向共享资源中写数据,当多个读、写线程共用一个资源(缓冲区)的时候,据需要使用诸如criticalsection或者互斥量的排他性锁(独占锁)来控制资源的访问,但是针对读操作较为频繁,写操作相对较少的情况下,使用独占锁是很不划算的,需要耗费更多的时间和其他资源。对于每个工作线程,建立一个管道,fds[0]用于工作线程接收来自主进程的数据,fds[1]用于主进程向工作线程发送数据(这里的数据只做信号作用),thread_setup()则为每个事件创建一个独立的事件域t->base,并在t->base中注册了管道io事件,fds[0]的读事件,读事件触发则执行thread_libevent_process(),它负责完成由主进程转来的客户端连接conn。
pthread_mutex_unlock(&lock);//解锁
}
return;
}
void*receiver(void*a)//接受数据
{
intx;
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;
}
intmain()
{
memset(buf,0,sizeof(buf));
pthread_ta,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);//回收资源
return0;
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-111970-1.html