线程池中利用函数指针对任务的动态绑定
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
在这段代码上增加队列,线程同步机制等之后,基本就构成了线程池系统。
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
在这段代码上增加队列,线程同步机制等之后,基本就构成了线程池系统。
相关文章推荐
- 利用指向函数的指针数组实现计算器
- 复习C语言系列二:动态调用函数指针数组
- C语言基础之函数、虚拟键盘的使用、数组、指针、动态申请内存、内存泄漏
- 利用VC调用动态链接库中的函数
- 指针数组与数组指针 指针函数与函数指针,内存动态分配
- 简析function/bind如何实现类成员函数指针绑定调用
- C和指针之动态内存分配之(编写calloc函数,函数内部使用malloc函数来获取内存)
- jquery动态绑定事件函数live()的运用
- 数组和指针、数组指针和指针数组、函数指针和指针函数、数组标识符的意义、静态和动态创建的数组的本质区别、标识符类型判断方法
- linux下利用ddclient免费为顶级域名绑定动态IP(非cname法)
- 利用spring+quartz-scheduler+MySql实现定时任务动态调整
- 第16周报告2(任务3)学会利用指针解决问题
- C语言学习9: malloc动态内存存储,动态内存分配去空格字符增长版,动态内存分配去符号incr增长版,型参和返回值都是int型的函数的指针,main函数的地址也可以用指针指向,typedef定义函数指针,函数定义与嵌套的作用,返回函数指针类型,const作用
- 虚函数的动态绑定
- PHP利用可变函数动态扩增类的属性
- Java利用接口和类来实现类似函数指针的功能
- 利用TreeView控件动态生成无限级树(续:通过绑定动态xml文件)
- 利用JQuery+Ajax实现aspx页面无刷新的动态数据绑定
- C#动态执行类库中的函数:利用反射实现(js)Eval,asp(Execute)功能
- 利用VC调用动态链接库中的函数