您的位置:首页 > 其它

线程池中利用函数指针对任务的动态绑定

2013-07-21 18:08 309 查看
最近刚刚接触线程,在网上搜了搜线程池的源码。看源码的过程中发现用了函数指针的运用,觉得比较有收获。其中比较重要的一个数据结构是

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 

在这段代码上增加队列,线程同步机制等之后,基本就构成了线程池系统。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐