首页 > 其他分享 >消息队列用于线程间通信

消息队列用于线程间通信

时间:2024-11-28 13:43:57浏览次数:6  
标签:mtype sendData 队列 间通信 int 线程 pthread msg include

#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;
}

 

标签:mtype,sendData,队列,间通信,int,线程,pthread,msg,include
From: https://www.cnblogs.com/czy363/p/18574129

相关文章

  • 线程池的创建及工作原理和Executor框架
    目录一、什么是线程池:二、创建线程池:三、线程池执行策略:四、如何合理的配置线程池的大小?五、Executor框架:六、Java线程模型:Java线程与操作系统线程的关系:七、ThreadPoolTaskExecutor:⭐八、真实项目的使用详解:九、线程池监控:一、什么是线程池:线程池主要是为了解决......
  • 什么是栈和队列?它们的主要区别是什么?
    栈(Stack)和队列(Queue)是两种常见的线性数据结构,它们的主要区别在于操作原则和应用场景。栈:栈是一种特殊的线性表,遵循后进先出(LastInFirstOut,LIFO)原则。这意味着最后进入栈的元素将是第一个被移出的元素。栈的操作主要集中在栈顶,只允许在栈顶进行插入(入栈)和删除(出栈)操作。......
  • 数据结构优先级队列PriorityQueue
    本章讲述数据结构中的优先级队列的学习,感谢大家的支持!欢迎大家踊跃评论,感谢大佬们的支持!我的博客主页数据结构中的优先级队列优先级队列的概念如何实现优先级队列?PriorityQueue优先队列实现大根堆实现小根堆实现插入元素删除元素堆排序PriorityQueue包注意事项......
  • java 多线程传统锁:synchronized,Lock锁
    传统锁:synchronized是内置关键词,无法获取锁的状态Lock锁:类是否获取到锁,需手动释放锁publicclassSaleTicketDem{publicstaticvoidmain(String[]args){Ticket2t=newTicket2();newThread(()->{for(inti=0;i<40;i++){t.sale();;}},"a").start();n......
  • 栈和队列
    栈和队列用栈实现队列classMyQueue{//定义全局变量Stack<Integer>stackIn;Stack<Integer>stackOut;publicMyQueue(){//通过使用两个栈来模拟队列stackIn=newStack<>();//负责进栈stackOut=newStack<>();//......
  • 【高性能组件(1)】手写线程池
    文章目录前言一、线程池介绍1.1为什么需要线程池?1.2线程池的作用1.3线程池的构成二、手写线程池2.1接口设计2.1.1封装原则2.1.2创建线程池的接口2.2数据结构设计2.3线程池线程数量选择2.3.1维持固定数量线程2.3.2线程数量选择2.4具体编码实现2.4.1外部接......
  • 【Linux】多线程(POSIX信号量、线程池、线程安全)
    ......
  • 消息队列实战指南
    消息队列实战指南......
  • [笔记]多重背包的优化(二进制,单调队列)
    P1776宝物筛选朴素多重背包for(inti=1;i<=n;i++){ for(intj=1;j<=m;j++){ for(intk=1;k*w[i]<=m&&k<=cnt[i];k++){ f[i][j]=f[i-1][j]; if(j>=w[i])f[i][j]=max(f[i][j],f[i-1][j-k*w[i]]+k*v[i]); } }}空间优化后:for(inti=1;i<=n;i++){......
  • 鸿蒙多线程开发——sendable共享容器
    1、异步锁机制在介绍共享容器之前,先介绍异步锁机制。为了解决多线程并发任务间的数据竞争问题,ArkTS引入了异步锁能力。异步锁可能会被类对象持有,因此为了更方便地在并发实例间获取同一个异步锁对象,AsyncLock对象支持跨线程引用传递。由于ArkTS语言支持异步操作,阻塞锁容易产......