首页IT科技线程池lambda(关于bind & 通过bing 和function实现线程池)

线程池lambda(关于bind & 通过bing 和function实现线程池)

时间2025-04-30 00:10:20分类IT科技浏览4817
导读:bind1st和bind2nd只能用于二元函数对象 c++11 bind绑定器 返回的结果还是个函数对象...

bind1st和bind2nd只能用于二元函数对象

c++11 bind绑定器 返回的结果还是个函数对象

std::bind函数定义在头文件functional中            ,是一个函数模板                  ,它就像一个函数适配器      ,接受一个可调用对象(callable object)         ,生成一个新的可调用对象来“适应            ”原对象的参数列表            。一般而言                  ,我们用它可以把一个原本接收N个参数的函数fn         ,通过绑定一些参数      ,返回一个接收M个(M可以大于N                  ,但这么做没什么意义)参数的新函数                  。同时            ,使用std::bind函数还可以实现参数顺序调整等操作

bind简单使用

#include <iostream> #include <string> #include <functional> using namespace std; void SayHello(string mess) { cout << "SayHello(string mess)" << endl; } int Play(int mess) { cout << "int Play(int mess)=" << mess << endl; return mess; } void Say(string mess) { cout << "int SayHello(int mess)=" << mess << endl; } class student { public: int show(int x) { cout << "Student int show(int x)" << endl; return x; } }; int main() { bind(SayHello, "Hello")(); //占位符 bind(&student::show, student(), placeholders::_1)(200); //使用fuction 接受bind返回值 function<int (int )> f= bind(Play, placeholders::_1); f(500); f(400); f(300); system("pause"); return 0; }

自己实现bind

#include <iostream> #include <string> #include <functional> using namespace std; template<typename T> class MyFunction {}; template<typename R, typename A> //接受函数,接受1个函数参数 class MyFunction<R(A)> { public: //定义函数指针 返回值R ,1个函数参数 typedef R(*pfunction)(A); MyFunction(pfunction _function , A _args) : function(_function), args(_args) {} R operator()() { return (*function)(args); } private: pfunction function; A args; }; //R 是函数   , A 是绑定的参数 template<typename R,typename A> MyFunction<R> mybind(R _function, A _args) { //返回函数对象 return MyFunction<R>(_function, _args); } int SayHello(int mess) { cout << "int SayHello(int mess)=" << mess << endl; return mess; } int main() { MyFunction<int(int)> r = mybind<int(int),int>(SayHello,100); r(); system("pause"); return 0; }

bind 和function 结合实现简单线程池

#include <iostream> #include <vector> #include<functional> #include<Thread> using namespace std; class MyThread { public: MyThread(function<void()> _f):f(_f) {} thread start() { return thread(f); } private: function<void()> f; }; class ThreadPool { public: ThreadPool() {} ~ThreadPool() { for (int i = 0; i < _pthreadPool.size(); ++i) { delete _pthreadPool[i]; } } void start(int size=10) { for (int i = 0; i < size; i++) { function<void()> f = bind(&ThreadPool::runThreadId,this, i); MyThread * pThread =new MyThread (f); _pthreadPool.push_back(pThread); }//end for for (int i = 0; i < size; i++) { _threadHandler.push_back(_pthreadPool[i]->start()); }//end for for (thread & t : _threadHandler) { t.join(); } } void runThreadId(int id) { cout << "runThreadId " << id << endl; } private: vector<MyThread *> _pthreadPool; vector<thread > _threadHandler; }; int main() { ThreadPool tp; tp.start(); system("pause"); return 0; }

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
百度贴吧连云港(连云港资讯) 搜索引擎优化的流程是什么?(搜索引擎优化包括哪几步)