b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

linux线程间通信示例

电脑杂谈  发布时间:2019-07-10 22:04:21  来源:网络整理

线程通信 pipe_linux 多线程通信_linux 线程间通信

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

{

linux 线程间通信_线程通信 pipe_linux 多线程通信

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

}

linux 线程间通信_线程通信 pipe_linux 多线程通信

return;

}

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

{

intx;

while(1)

{

pthread_mutex_lock(&lock);//锁

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

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

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

linux 多线程通信_linux 线程间通信_线程通信 pipe

if(x!=0)

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

else

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

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

pthread_mutex_unlock(&lock);//解锁

}

return;

}

intmain()

{

线程通信 pipe_linux 多线程通信_linux 线程间通信

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

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...