线程间通信机制 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()
{
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;
}
更多阅读
线程中的悲观锁和乐观锁 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
总结一些关于android 异步线程通信的知识 android 线程间通信
什么时候使用多线程:1. 耗时操作使用多线程, 耗时操作放在UI线程中会导致用户的操作无法得到响应.2. 阻塞操作使用多线程, 理由同上.3. 多核CUP的设备使用多线程, 可以有效提高CPU的利用率.4. 并行操作使用多线程.android中的多线程