在代码的逻辑中,我们经常需要把一些操作放到一个线程中去执行,比如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)
{