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>
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;
}
}
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;
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. 运行截图