消息队列用于线程间通信
我们知道,消息队列是进程间通信的方法之一,
当然,消息队列也可以用于线程间通信。
进程间通信的时候,我们需要使用ftok()函数创建同一个key值,(当然,进程间通信,key值我们可以自定义同一个值,而不必非要调用ftok函数,这步可以省掉。)线程间通信时,我们就是采用直接自定义key值的方法,这样比较简便。
示例:
#include <unistd.h>
#include <stdio.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>pthread_t pid_1,pid_2;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int msgid;
typedef struct{long mtype;int date;
}msg;
void *func2(void *arg)
{int i = 1,j =1;msg sendData;pthread_detach(pthread_self());while(1){sleep(2);sendData.mtype = i++;sendData.date= j++;if(( msgsnd(msgid,&sendData,sizeof(msg)-sizeof(sendData.mtype),0))<0){perror("msgsnd:");pthread_exit(NULL);}else{pthread_mutex_lock(&mutex);printf("send:mtype= %ld,data = %d\n",sendData.mtype,sendData.date);pthread_mutex_unlock(&mutex);}}
}
void *func1(void *arg)
{pthread_create(&pid_2,NULL,func2,NULL);msg reData;while(1){if((msgrcv(msgid,&reData,sizeof(reData)-sizeof(reData.mtype),0,0))<0){perror("msgrcv:");pthread_exit(NULL);}else{pthread_mutex_lock(&mutex);printf("recv:mtype= %ld,data = %d\n",reData.mtype,reData.date);pthread_mutex_unlock(&mutex);}}pthread_join(pid_2,NULL);printf("func1--son exit \n");}int main(int argc, char *argv[])
{if((msgid = msgget(3123,IPC_CREAT|0666))<0){perror("msgget:");return 0;}pthread_create(&pid_1,NULL,func1,NULL);pthread_join(pid_1,NULL);printf("main--son exit \n");printf("father exit\n");return 0;
}
运行结果:
总结:
1) 消息队列可以用于线程间通信;
2)在同一进程中的话,只需要msgget一次获得一个全局的消息id即可。
3)
msgrcv的使用,当没有消息过来时,msgrcv是阻塞在这里的,
此时的现象是,不会perror报错,也不会打印else中的内容,just阻塞在这里,
只有当msgsnd过来消息后,才会printf打印输出。
4)消息类型中的mtype必须是大于0的,测试改成0后,结果:
消息队列用于线程间通信相关推荐
- C++ 九阴真经之线程间通信(消息队列)
消息队列是线程间通信比较常用得方式,常用于解决经典模型生产者--消费者模型线程间得通信. 本文将结束基于C++标准库实现得消息队列,可以支持任意参数类型,任务参数数量. 为了方便后续线程池.异步队列得 ...
- IOT-OS之RT-Thread(六)--- 线程间同步与线程间通信
文章目录 一.IPC对象管理 1.1 IPC对象控制块 1.2 IPC对象接口函数 二.线程间同步对象管理 2.1 信号量对象管理 2.2 互斥量对象管理 2.3 事件集对象管理 三.线程间通信对象管 ...
- RT-Thread OS线程间通信之邮箱
本文参考引用于RT-Thread 官方文档中心 在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取,根据读取到的全局变量值执 ...
- python线程间通信_python多线程之事件触发(线程间通信)
执行结果: 那么,通过分析执行结果来看,您已经体会到了其中的秘密.... 再脑补一下: Python提供了Event对象用于线程间通信,它是由线程设置的信号标志,如果信号标志位真,则其他线程等待直到信 ...
- ios开发笔记之 线程间通信
performSelectorOnMainThread:selector:waitUntilDone: 用于线程间通信 使两个线程同步或者时异步执行. block阻塞 转载于:https://www. ...
- 用于线程间的同步与互斥-信号量sem
一.线程 首先我们说一下什么是线程.线程是计算机中独立运行的最小单位,在运行时占用很少的系统资源,由于每个线程占用的CPU时间是由系统分配的,因此我们可以把线程看作为系统分配CPU时间的基本单位.在我 ...
- Python中线程间通信
Python中线程间通信 一.前言 二.什么是互斥锁 三.使用互斥锁 四.使用队列在线程间通信 五.关于线程需要注意的两点 一.前言 我们已经知道进程之间不能直接共享信息,那么线程之间可以共享信息 ...
- 【Android】线程间通信——Handler消息机制
文章目录 引言 Java层 永动机跑起来 示例 Looper Handler MessageQueue 永动机停下 Native层 nativeInit() nativePollOnce() nati ...
- Disruptor本地线程队列_实现线程间通信---线程间通信工作笔记001
Disruptor本地线程队列_实现线程间通信---线程间通信工作笔记001 看到同事用这个东西了,这个挺好用的说是,可以实现,本地线程间的通信,好像在c++和java中都可以用 现在没时间研究啊,暂 ...
最新文章
- Cell子刊:人类微生物组参考基因集中的单体基因
- 如何在自己工程项目中使用TouchJSON框架
- 前沿分享|阿里云资深技术专家 魏闯先:AnalyticDB PostgreSQL年度新版本发布
- 如何在ASP.NET服务器控件库中嵌入JavaScript脚本文件 [适用于.NET 2.0]
- 拼图游戏C语言课设实验报告,C语言拼图游戏实验报告.doc
- public 函数_UE4精品教程 | 渲染编程(C++篇)【第三卷:从仿函数到std::function再到虚幻4Delegate】...
- eclipse的SVN插件设置忽略文件
- 低秩矩阵分解 matlab,低秩分解的matlab代码看不懂,分解的两个矩阵在哪呀??...
- 解析ip分组_快来看看!!!你经常忽略的TCP/IP知识点~
- 数组的 sort() 方法详解
- 发票管理软件_企业为什么需要采购管理软件?
- CrystalBall
- Nginx流媒体服务器搭建
- 程序员怎样出版一本技术书
- 解决K650C ubuntu下不能重启关机问题
- spring成神之路第十八篇:@ComponentScan、@ComponentScans 详解(bean 批量注册)
- 《图解TCP/IP》——第一章 网络基础知识
- Masking GAN
- 三口烧瓶规格有哪些_什么是三口烧瓶,应该如何制作 | | 化工资讯网
- 华为ensp搭建习题