C语言创建一个发送数据线程,一个接收数据的线程

1. 发送数据的线程

发送的数据可以是任何想要定义的结构体,使用void* data去指向地址,并定义好我们的消息头,现在值定义了事件,可以根据需要去进行增加消息头的公共信息段。
void *sendMessage(void *arg)
{
    struct ListNode *listNode ;
    
    
    listNode= (struct ListNode *)arg;
    int index = 0;
    while(1)
    {
        index ++;
        if(index % 2 == 0)
        {//发送学生数据
            Student *stu = (Student *) malloc(sizeof(Student));
            stu->age = index;
            stu->name = "wu";
            
            MessageHead messageHead ;
            messageHead.event = STUDENT;
            addNodetail(listNode,stu,messageHead);
            printf("send success name %s age %d \n",stu->name,stu->age); 
            _sleep(1000);
        } 
        else
        {
            Teacher *teacher = (Teacher *) malloc(sizeof(teacher));
            teacher->age = index *2 ;
            teacher->name = "psy";
            MessageHead messageHead ;
            messageHead.event = TEACHER;
            addNodetail(listNode,teacher,messageHead);
            
            printf("send success name %s age %d \n",teacher->name,teacher->age); 
            _sleep(1000);
        }
        
    }
    
}

2. 接收数据的线程

 接收的数据根据消息头,进入不同Switch进行处理,然后用不同的消息头去处理对应的数据,将对应的data使用对应的结构体转化成对应的数据。
void *recvMessage(void *arg)
{
    struct ListNode *listNode ;
    Student *student = (Student *) malloc(sizeof(Student));
    Teacher *teacher = (Teacher *) malloc(sizeof(Teacher));
    listNode= (struct ListNode *)arg;
    ListNode *node = NULL;
    while(1)
    {
        node = getListHead(listNode);
        if(node != NULL)
        {
            switch (node->message.event)
            {
            case STUDENT:
                student = (Student *)node->data;
                printf("recv Student data success name %s age %d \n",student->name,student->age); 
                free(node);
                break;
            case TEACHER:
                teacher = (Teacher *)node->data;
                printf("recv Teacher data success name %s age %d \n",teacher->name,teacher->age); 
                free(node);
                break;
            default:
                break;
            }
        }
        else
        {
            printf("node is null \n");
        }
        _sleep(2000);
        
    }
}

3.链表的创建


#include <stdio.h>
#include "List.h"
#include "Student.h"
#include <malloc.h>
/**
 * @description: 链表初始化
 * @return {*}
 */
ListNode *InitList()
{
    ListNode *node = (ListNode *) malloc(sizeof(ListNode));
	if(node == NULL)
    {
        printf("create fail ! \n");
        return 0;
    }
    else
    {
        printf("node init success !\n");
        node->message.event = INVAILD;
        node->data = NULL;
        node->next = NULL;
        return node;
    }
    
}

/**
 * @description: 增加一个节点
 * @param {ListNode} *list
 * @param {void} *data
 * @return {*}
 */
void addNodetail(ListNode *list , void *data ,MessageHead messageHead)
{
    ListNode *tmpNode = (ListNode *)malloc(sizeof(ListNode));  
    ListNode *tmpList = list;
    while(tmpList->next != NULL)
    {
        tmpList = tmpList->next ;
    }
    messageHead.count = tmpList->message.count++;
    tmpNode->data = d
    tmpNode->message = messageHead;
    tmpList->next = tmpNode;
    tmpNode->next = NULL; 
    return ;
}

ListNode *getListHead(ListNode *list)
{
    ListNode *node = NULL;
    if(list->next != NULL )
    {
        node = list->next;
        list->next = list->next->next;
    }
    return node; 
}
void PrintfList(ListNode *list)
{
    Student *student = (Student *) malloc(sizeof(Student));
    ListNode *tmpList = list;
    while(tmpList->next != NULL)
    {
        student =  (Student *)tmpList->next->data;
        printf("data %d ",student->age);
        tmpList->next = tmpList->next->next;
    }
    printf("\n");
}

4. 角色的定义暂时只使用这两个数据进行定义

typedef struct Student
{
    int age;
    char *name;
}Student;
typedef struct Teacher
{
    int age;
    char *name;
}Teacher;

5. Main函数,创建了线程已经两个线程公共的链表,一个只负责发数据,一个只负责接收数据,就没有使用上锁的机制.


int main(void )
{
    ListNode *cmList = InitList();//共享链表的创建
    pthread_t sendThread , recvThread;//创建sendThread,recvThread线程 
    int ret = pthread_create(&sendThread,NULL,sendMessage,cmList); 
    int retRecv = pthread_create(&recvThread,NULL,recvMessage,cmList); 
    if(ret < 0 )
    {
        printf("thread send Message create fail !\n");
    }
    pthread_join(sendThread,NULL);
    
    if(retRecv < 0 )
    {
        printf("thread recv Message create Fail !\n");
    }
    pthread_join(recvThread,NULL); 
    return 0 ;
}


6. 运行截图

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曾许人间第一流.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值