looper线程的简单实现

本文探讨了在代码逻辑中使用Looper线程的重要性,特别是在Android中确保UI更新在主线程进行。通过一个C语言实现的Looper线程示例,解释了为何在处理消息时不需要加锁,因为消息一旦取出并处理,不会被其他线程修改。同时,文章提到了潜在的死锁问题,当Looper线程与MQTT客户端操作交互时,如果两者锁的获取顺序不一致,可能导致死锁。最后,提供了一个简单的Looper API使用示例。
摘要由CSDN通过智能技术生成

在代码的逻辑中,我们经常需要把一些操作放到一个线程中去执行,比如android 中的更新UI就只能在main线程中执行,这样做是为了避免有些资源被两个(多个)线程“同时”修改。下面是用c语言实现的looper线程。


#ifndef __MESSAGE_LOOPER_H__
#define __MESSAGE_LOOPER_H__

#include <pthread.h>

#define MAX_MESSAGE_SIZE  256
#define MESSAGE_EXIT_LOOP  -1

typedef struct message_t
{
    int what;
    struct message_t* next;
    int data_size;
    void* data;
} message_t;

typedef struct{
   message_t* head;
   int size;
} message_queue_t;

typedef void (*CALLBACK_FUNC)(message_t *msg);

typedef struct{
    int is_loop;  //退出线程循环标志
    pthread_t looper_thread;
    pthread_mutex_t queue_mutex;
    pthread_cond_t queue_cond;
    message_queue_t queue;
    CALLBACK_FUNC handle_msg; //消息处理函数
} message_looper_t;


int create_looper(message_looper_t** looper,CALLBACK_FUNC func);

int start_loop(message_looper_t* looper);

int stop_loop(message_looper_t* looper);

int destroy_looper(message_looper_t* looper);

int push_message(message_looper_t* looper,int what,const void* data,int size);

#endif

对应的实现代码


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "message_looper.h"

static message_t* fetch_message(message_queue_t* queue)
{
    if(queue->size<1)
    {
        return NULL;
    }
    message_t* message = queue->head;
    queue->head=message->next;    //取出队列头的消息后,消息队列指向下一个
    (queue->size)--;
    return message;
}

static int delete_message(message_t* message)
{
    if(message==NULL)
    {
        printf("[message_looper] delete_message message is null.\n");
        return -1;
    }
    if(message->data!=NULL)
    {
         free(message->data);
         message->data = NULL;
    }
    free(message);
    return 0;
}

static int clear_message_queue(message_queue_t* queue)
{
    if(queue==NULL)
    {
      
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值