最近刚刚接触线程,在网上搜了搜线程池的源码。看源码的过程中发现用了函数指针的运用,觉得比较有收获。其中比较重要的一个数据结构是
struct task {
void* (*func) (void* );
void* arg;
}
在c语言中凡是涉及动态绑定的时候我总能看到函数指针的身影。
于是我写了个测试程序。
#inlcude <stdio.h>
#include <pthread.h>
struct task {
void* (*func)(void* );
void* arg;
};
void* task1 (void* argfun1) {
printf ("1 ");
}
void* task2 (void* argfun2) {
printf ("2 ");
}
void* (*pfun) (void* );
void* argfun;
void* idle (void* p) {
struct task temp;
for (;;) {
temp.func = pfun;
temp.arg = argfun;
temp.func(temp.arg); /*关键一步,调用需要绑定的任务*/
usleep (100000);
}
}
int main (void) {
pthread_t id;
pfun = task1; /*先给pfun赋值,把task1绑定到线程中的idle,否则在创建线程后调用空的函数指针会发生段错误*/
argfun = NULL;
pthread_create (&id, 0, idle, 0); /*idle为空任务,只负责给函数指针赋值,并调用相关函数,这里先执行task1*/
sleep(1);
pfun = task2; /*用task2 替换task1,吧task2绑定到线程*/
sleep(1);
}
运行结果:
1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2
在这段代码上增加队列,线程同步机制等之后,基本就构成了线程池系统。