线程间通信机制 linux下进程间通信机制

应用环境:

应用程序的线程1模拟端机设备接收UDP的图片数据包,并写入文件;

线程2读取文件,并再次通过UDP包发出去;

线程2阻塞,直到线程1收完数据并关闭文件后,唤醒并开始工作;

通信机制:

互斥锁:

以排他方式防止数据结构被并发的修改;

定义互斥锁:pthread_mutex_t lock;

互斥锁管理:1.互斥锁属性控制(范围、属性、协议、优先级、强健)

2.互斥锁基本操作(锁定、解锁、非阻塞锁定)

使用宏初始化静态分配的互斥锁:不需要调用pthread_mutex_init

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

锁定及解锁:pthread_mutex_lock()

pthread_mutex_trylock()

pthread_mutex_unlock()

条件变量:

根据保护数据的当前值来调整线程的行为;

条件变量与互斥锁始终一起使用;

使用条件变量可以以原子方式阻塞线程,直到某个特定条件为真为止;

如果条件为假,线程基于条件变量阻塞,并以原子方式释放等待条件变

化的互斥锁;

如果其他线程更改了条件,会向相关的条件变量发出信号,从而使一个

或多个等待的线程执行如下操作:唤醒、再次评估互斥锁、重新评估条件

定义条件变量:pthread_cond_t condition;

条件变量管理:1.条件变量属性控制(初始化、删除、范围)

2.条件变量基本操作(阻塞、解阻塞、定时阻塞)

条件变量初始化及销毁:pthread_cond_init()

pthread_cond_destroy()

取消阻塞:pthread_cond_signal()

pthread_cond_broadcast()

等待或定时条件变量:pthread_cond_wait()

pthread_cond_timedwait()

应用实例:

主函数创建2个线程,定义全局结构体,并初始化互斥锁和条件变量;

线程2 bs_rcv_pic_thread使用条件变量阻塞,线程1 ms_snd_pic_thread在recvfrom处阻塞等待UDP数据包,所以在线程1不能给互斥锁上锁,当接收到数据并写完文件后,向条件变量发出信号,以唤醒等待线程2,bs_rcv_pic_thread开始工作。

#include <stdio.h>

#include <stdlib.h>

#include <pthread.h>

pthread_mutex_t main_lock = PTHREAD_MUTEX_INITIALIZER;

pthread_cond_t main_cond;

struct global

{

pthread_mutex_t lock ; //互斥锁

pthread_cond_t cond; //条件变量

}global;

int main()

{
线程间通信机制 linux下进程间通信机制

struct global gbl;

//pthread_mutex_init(&main_lock,NULL); //初始化互斥锁

pthread_cond_init(&main_cond,NULL); //初始化条件变量

gbl.lock = main_lock;

gbl.cond = main_cond;

pthread_t p0,p1; //创建2个线程,并传递全局参数

pthread_create(&p0, NULL, ms_snd_pic_thread, (void *)&gbl);

pthread_create(&p1, NULL, bs_rcv_pic_thread, (void *)&gbl);

while(1)

{

}

pthread_join(p0, NULL);

pthread_join(p1, NULL);

pthread_mutex_destroy(&main_lock); //销毁互斥锁

return 0;

}

void* ms_snd_pic_thread(void *arg)

{

printf("%sn",__FUNCTION__);

struct global *gbl = (struct global *)arg;

//pthread_mutex_lock(&gbl->lock);

……

recvfrom(); //阻塞等待接收UDP

……

printf("rcv %d finish! n",count);

printf("signal cond n");

pthread_cond_signal(&gbl->cond); //向条件变量发出信号

//pthread_mutex_unlock(&gbl->lock);

}

void* bs_rcv_pic_thread(void *arg)

{

printf("%sn",__FUNCTION__);

struct global *gbl = (struct global *)arg;

//pthread_mutex_lock(&gbl->lock);

printf("block wait cond signal! n");

pthread_cond_wait(&gbl->cond,&gbl->lock); //阻塞等待条件变量更改

printf("unblock n");

……

//pthread_mutex_unlock(&gbl->lock);

printf("all %d bytes sendn",count);

return;

}

  

爱华网本文地址 » http://www.413yy.cn/a/25101012/117786.html

更多阅读

线程中的悲观锁和乐观锁 java中乐观锁和悲观锁

线程中的锁可以分为乐观锁和悲观锁,这两个都是实现锁机制的两种办法。悲观锁:根据字面意思,悲观,就是不是太好的。当一个线程访问这个数据的时候,悲观锁会把这个数据给锁住,不被其他线程所访问,直到这个线程完成了对数据的提交后,其他线程

linux 下多线程编程 linux下的多线程编程

共13章:第一章 线程基础multithreading可以被翻译成多线程控制。与传统的UNIX不同,一个传统的UNIX进程包含一个单线程,而多线程(MT)则把一个进程分成很多可执行线程,每一个线程都独立运行。阅读本章可以让你理解:Defining Multithreading T

php进程后台调用(多线程/进程) php 多进程与多线程

php进程后台调用http://blog.iyi.cn/start/2006/11/php_6.html这两天在研究php模拟多线程的问题,碰到一个问题就是无论exec、popen、还是proc_open都会造成等待,也就是阻塞式的调用,而我想要得是无阻塞的调用,让程序在后台执行就可以解

Linux下Qt多线程编程 linux下的多线程编程

作者:武汉华嵌技术部以下和大家分享Linux平台下Qt两种多线程编程的方式:1、使用Linux平台下的线程函数。以下是给出的代码片段://此处为连接信号和槽,通过Qt界面中两按钮来控制两个槽函数connect(pthred1start, SIGNAL(clicked()), this

声明:《线程间通信机制 linux下进程间通信机制》为网友人间风雪客分享!如侵犯到您的合法权益请联系我们删除