在新浪博客里面提到了几点线程池的关键技术:1. 链表 2. 线程间的同步互斥 3. 函数指针
今天我们来实现一把。
下面的代码都是自己抽空写的,编译运行过。
list.h
#ifndef _list_h
#define _list_h
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
//#define IF_LOCK_LIST 0
struct s_dlist_node {
struct s_dlist_node *pre;
struct s_dlist_node *next;
void *data;
};
struct s_dlist {
struct s_dlist_node *head;
pthread_mutex_t pth_mutex;
int s_dlist_len;
};
struct s_dlist *dlist_create();
struct s_dlist_node *dlist_node_create(void *data);
bool dlist_insert_ahead(struct s_dlist *dlist, void *data);
struct s_dlist_node *dlist_pop_last(struct s_dlist *dlist);
bool dlist_isempty(struct s_dlist *dlist);
#endif
list.cpp
#include "list.h"
struct s_dlist_node *dlist_node_create(void *data)
{
struct s_dlist_node *node =
(struct s_dlist_node *)malloc(sizeof(struct s_dlist_node));
if (node == NULL) {
return NULL;
}
node->pre = NULL;
node->next = NULL;
node->data = data;
return node;
}
bool dlist_free(struct s_dlist *dlist)
{
struct s_dlist_node *node;
while (!dlist_isempty(dlist)) {
node = dlist_pop_last(dlist);
printf("get a num from list:%d\n", *(int *)(node->data));
free(node);
}
free(dlist->head);
free(dlist);
return true;
}
struct s_dlist *dlist_create()
{
struct s_dlist *dlist =
(struct s_dlist *)malloc(sizeof(struct s_dlist));
if (dlist == NULL) {
return NULL;
}
struct s_dlist_node *head = dlist_node_create(NULL);
head->p