线程邮箱(创建一个邮箱链表,用链表链接三个线程,线程下创建队列用来发送接收数据)

main函数

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <list.h>

#include <queue.h>
#define ENTER_CRITICAL_AREA(mutex)  do{pthread_mutex_lock(mutex);}while(0)
#define QUIT_CRITICAL_AREA(mutex)  do{pthread_mutex_unlock(mutex);}while(0)

unsigned pthread_index;

LIST_LINK *end_list = NULL;

//typedef struct thread_node
//{
//    pthread_t tid;         //线程id号
//    char name[256];        //线程名字 ,必须唯一
//    Que *amil_head, *mail_tail;
//    th_fun th;              //线程函数

//}TH_NODE;

typedef struct mail_box_system
{
    pthread_mutex_t mutex;  //保护邮件系统
    LIST_LINK *thread_list;
}MBS;
MBS* mbs;

int send_msg(MBS*msb,char*recvname,DATATYPE data);
int recv_msg(MBS*msb,char*sendname,DATATYPE data);

MBS* create_mail_box_system()
{
    MBS *temp =(MBS*)malloc(sizeof(MBS));

    if(NULL ==  temp)
    {
        perror("create_mail_box_system mutex malloc failure\n");
        return NULL;
    }
    int ret = pthread_mutex_init(&temp->mutex,NULL);
    if(0 != ret)
    {
        perror("create_mail_box_system mutex init failure\n");
        return NULL;
    }
    temp->thread_list = malloc(sizeof(LIST_LINK));
   // memset(temp->thread_list, 0, sizeof(LIST_LINK));
    temp->thread_list->next = NULL;
    printf("mail box create ok!! \n");
    return temp;
}

int destroy_mail_box_system(MBS*mbs)
{
    pthread_mutex_destroy(&mbs->mutex);
    LIST_LINK *temp = NULL;
    LIST_LINK *find = mbs->thread_list;
    while(find !=  NULL)
    {
        temp = find;
        find = find->next;
        free(temp);
    }
    free(find);
    return 0;
}

int  register_to_mail_system(MBS *mbs,char name[],th_fun th)
{
    LIST_LINK* temp =  malloc(sizeof(LIST_LINK));
    if(NULL == temp)
    {
        perror("register to mail malloc  \n");
        return -1;
    }
    strcpy(temp->elem.name ,name);
    temp->elem.th = th;
    init_que(temp);

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现线程邮箱的基本思路是利用链表结构来存储消息,并使用互斥锁保证线程安全。具体实现步骤如下: 1. 定义一个链表结构体,包含消息内容和指向下一个节点的指针。 ```c typedef struct message { char *content; struct message *next; } Message; ``` 2. 定义一个邮箱结构体,包含链表头节点指针和互斥锁变量。 ```c typedef struct mailbox { Message *head; pthread_mutex_t lock; } Mailbox; ``` 3. 实现初始化邮箱函数,创建邮箱并初始化互斥锁变量。 ```c void init_mailbox(Mailbox *mailbox) { mailbox->head = NULL; pthread_mutex_init(&mailbox->lock, NULL); } ``` 4. 实现发送消息函数,在链表尾部插入新的消息节点。 ```c void send_message(Mailbox *mailbox, char *content) { Message *message = (Message *) malloc(sizeof(Message)); message->content = content; message->next = NULL; pthread_mutex_lock(&mailbox->lock); if (mailbox->head == NULL) { mailbox->head = message; } else { Message *tail = mailbox->head; while (tail->next != NULL) { tail = tail->next; } tail->next = message; } pthread_mutex_unlock(&mailbox->lock); } ``` 5. 实现接收消息函数,从链表头部取出消息节点并删除。 ```c char *receive_message(Mailbox *mailbox) { pthread_mutex_lock(&mailbox->lock); if (mailbox->head == NULL) { pthread_mutex_unlock(&mailbox->lock); return NULL; } else { Message *message = mailbox->head; char *content = message->content; mailbox->head = message->next; free(message); pthread_mutex_unlock(&mailbox->lock); return content; } } ``` 6. 最后,在主函数中创建多个线程并使用邮箱来通信。 ```c void *thread_func(void *arg) { Mailbox *mailbox = (Mailbox *) arg; char *message = receive_message(mailbox); printf("Thread got message: %s\n", message); free(message); pthread_exit(NULL); } int main() { Mailbox mailbox; init_mailbox(&mailbox); send_message(&mailbox, "Hello"); send_message(&mailbox, "World"); pthread_t thread1, thread2; pthread_create(&thread1, NULL, thread_func, &mailbox); pthread_create(&thread2, NULL, thread_func, &mailbox); pthread_join(thread1, NULL); pthread_join(thread2, NULL); return 0; } ``` 以上就是用链表实现线程邮箱的基本步骤,可以根据实际需求进行修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值