本文主要是介绍线程池中利用函数指针对任务的动态绑定,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
最近刚刚接触线程,在网上搜了搜线程池的源码。看源码的过程中发现用了函数指针的运用,觉得比较有收获。其中比较重要的一个数据结构是
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
在这段代码上增加队列,线程同步机制等之后,基本就构成了线程池系统。
这篇关于线程池中利用函数指针对任务的动态绑定的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!