linux下线程间通信,linux线程间通信示例

d33f3cbd10e141b788e43a4f32bdccad.png

#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个数据

{

6acebbe2197e23d1e58b93a937ed9442.png

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);//解锁

}

552251c17aaa49632fc44a62e60fe939.png

return;

}

void*receiver(void*a)//接受数据

{

intx;

while(1)

{

pthread_mutex_lock(&lock);//锁

if(r==w)//缓冲区是否有数据

pthread_cond_wait(&is_empty,&lock);//没有数据,等待发送线程发数据

x=buf[r++];//有数据了,取走

13-810-jpg_6-1080-0-0-1080.jpg

if(x!=0)

printf("--->%d/n",x);//打印出来

else

break;//数据发送->接受完了,结束线程

pthread_cond_signal(&is_full);//缓冲区至少还有一个空间可以让发送进程发送数据

pthread_mutex_unlock(&lock);//解锁

}

return;

}

intmain()

{

ae4a5c7fc95f6b7dedabfb5c5d5c7162.gif

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值