我们知道,消息队列是进程间通信的方法之一,

当然,消息队列也可以用于线程间通信。

进程间通信的时候,我们需要使用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后,结果:

消息队列用于线程间通信相关推荐

  1. C++ 九阴真经之线程间通信(消息队列)

    消息队列是线程间通信比较常用得方式,常用于解决经典模型生产者--消费者模型线程间得通信. 本文将结束基于C++标准库实现得消息队列,可以支持任意参数类型,任务参数数量. 为了方便后续线程池.异步队列得 ...

  2. IOT-OS之RT-Thread(六)--- 线程间同步与线程间通信

    文章目录 一.IPC对象管理 1.1 IPC对象控制块 1.2 IPC对象接口函数 二.线程间同步对象管理 2.1 信号量对象管理 2.2 互斥量对象管理 2.3 事件集对象管理 三.线程间通信对象管 ...

  3. RT-Thread OS线程间通信之邮箱

    本文参考引用于RT-Thread 官方文档中心 在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取,根据读取到的全局变量值执 ...

  4. python线程间通信_python多线程之事件触发(线程间通信)

    执行结果: 那么,通过分析执行结果来看,您已经体会到了其中的秘密.... 再脑补一下: Python提供了Event对象用于线程间通信,它是由线程设置的信号标志,如果信号标志位真,则其他线程等待直到信 ...

  5. ios开发笔记之 线程间通信

    performSelectorOnMainThread:selector:waitUntilDone: 用于线程间通信 使两个线程同步或者时异步执行. block阻塞 转载于:https://www. ...

  6. 用于线程间的同步与互斥-信号量sem

    一.线程 首先我们说一下什么是线程.线程是计算机中独立运行的最小单位,在运行时占用很少的系统资源,由于每个线程占用的CPU时间是由系统分配的,因此我们可以把线程看作为系统分配CPU时间的基本单位.在我 ...

  7. Python中线程间通信

    Python中线程间通信 一.前言 二.什么是互斥锁 三.使用互斥锁 四.使用队列在线程间通信 五.关于线程需要注意的两点 一.前言   我们已经知道进程之间不能直接共享信息,那么线程之间可以共享信息 ...

  8. 【Android】线程间通信——Handler消息机制

    文章目录 引言 Java层 永动机跑起来 示例 Looper Handler MessageQueue 永动机停下 Native层 nativeInit() nativePollOnce() nati ...

  9. Disruptor本地线程队列_实现线程间通信---线程间通信工作笔记001

    Disruptor本地线程队列_实现线程间通信---线程间通信工作笔记001 看到同事用这个东西了,这个挺好用的说是,可以实现,本地线程间的通信,好像在c++和java中都可以用 现在没时间研究啊,暂 ...

最新文章

  1. Cell子刊:人类微生物组参考基因集中的单体基因
  2. 如何在自己工程项目中使用TouchJSON框架
  3. 前沿分享|阿里云资深技术专家 魏闯先:AnalyticDB PostgreSQL年度新版本发布
  4. 如何在ASP.NET服务器控件库中嵌入JavaScript脚本文件 [适用于.NET 2.0]
  5. 拼图游戏C语言课设实验报告,C语言拼图游戏实验报告.doc
  6. public 函数_UE4精品教程 | 渲染编程(C++篇)【第三卷:从仿函数到std::function再到虚幻4Delegate】...
  7. eclipse的SVN插件设置忽略文件
  8. 低秩矩阵分解 matlab,低秩分解的matlab代码看不懂,分解的两个矩阵在哪呀??...
  9. 解析ip分组_快来看看!!!你经常忽略的TCP/IP知识点~
  10. 数组的 sort() 方法详解
  11. 发票管理软件_企业为什么需要采购管理软件?
  12. CrystalBall
  13. Nginx流媒体服务器搭建
  14. 程序员怎样出版一本技术书
  15. 解决K650C ubuntu下不能重启关机问题
  16. spring成神之路第十八篇:@ComponentScan、@ComponentScans 详解(bean 批量注册)
  17. 《图解TCP/IP》——第一章 网络基础知识
  18. Masking GAN
  19. 三口烧瓶规格有哪些_什么是三口烧瓶,应该如何制作 | | 化工资讯网
  20. 华为ensp搭建习题

热门文章

  1. 计算机怎么硬盘重做系统,用硬盘如何直接在电脑上重装系统
  2. 复数计算器(C/C++)
  3. 小小树莓派鉴黄初体验 OpenNSFW on RPi
  4. Gauss–Jacobi_quadrature(MATLAB)
  5. Chrome批量打开多个网站
  6. 零基础怎么学好画设计素描?学画设计素描的方法有哪些?
  7. B. Even Array
  8. Subspace Inversion
  9. PHP 实现定时任务的几种方法
  10. CentOS 7一键安装Seafile搭建私有云存储