C++高级——bind和function联动实现微线程池

bind

昨天有粉丝问我,bind1st和bind有啥区别?今天就来简单讲讲。

bind1st和bind2nd在STL中主要用于二元函数对象,将其中的一元绑定成一个固定的量,成为一元函数变量。
在C++11标准中,这两位因为不够灵活,所以已经被bind所取代。

bind起源于非标准boost库,在c++11标准中正式纳入标准库,其更加灵活,最多可以绑定20个函数对象的参数。

bind的用法

先随便整上点函数:

void hello(string str) {
    cout << str << endl; }

int sum(int a, int b) {
    return a + b; }

class Test
{
   
public:
	int sum(int a, int b) {
    return a + b; }
};

然后再来看bind的实际应用:

int main()
{
   
	// bind是函数模板 可以自动推演模板类型参数
	bind(hello, "hello bind!")()//result:print:hello bind!
	cout << bind(sum, 10, 20)() << endl;//result:print:30
	cout << bind(&Test::sum, Test(), 20, 30)() << endl;//result:print:50
	// 参数占位符 绑定器出了语句,无法继续使用
	bind(hello, _1)("hello bind 2!");
	cout << bind(sum, _1, _2)(200, 300) << endl;//result:print:500
	return 0;
}

在语句bind(hello, "hello bind!")();中,bind将“hello bind!”绑定至hello的string类型参数,并返回一个函数对象,调用这个函数对象的operator()函数,完成打印字符串的过程。

在语句bind(hello, _1)("hello bind 2!");中的_1是名称空间 placeholders中的,用法placeholder::_1
此为参数占位符,代表hello的第一个参数等待用户输入。在本例中将参数“hello bind 2!”传递给operator()函数完成调用。

用function实现对bind绑定的函数对象的类型保留

bind有个缺点,不知道大家发现了没有。
bind无法保存它所绑定过的函数对象!

所以就需要function和它进行配合。

int main()
{
   
	function<void(string)> func1 = bind(hello, _1);
	func1("hello china!");
	func1("hello shan xi!");
	func1("hello si chuan!");

	return 0;
}

bind 和function实现线程池(假)

先把线程类定义好:

// 线程类
class Thread
{
   
public:
	Thread(function<void(int)> func, int no) :_func(func), _no(no) {
   }
	//这里需要包含头文件#include<thread>
	thread start()
	{
   
		//定义线程t执行func函数
		thread t(_func, _no); // _func(_no)
		return t;
	}
private:
	function<void(int)> _func;//接收绑定器返回的函数对象
	int _no;//线程编号
};

再定义好线程池类:

// 线程池类
class ThreadPool
{
   
public:
	ThreadPool() {
   }
	~ThreadPool()
	{
   
		// 这里是指针,所以不能依靠vector析构自动析构,得手动释放Thread对象占用的堆资源
		for (int i = 0; i < _pool.size(); ++i)
		{
   
			delete _pool[i];
		}
	}
	// 开启线程池
	void startPool(int size)
	{
   
		for (int i = 0; i < size; ++i)
		{
   
			_pool.push_back(
				new Thread(bind(&ThreadPool::runInThread, this, _1), i));
		}

		//执行线程函数
		for (int i = 0; i < size; ++i)
		{
   
			_handler.push_back(_pool[i]->start());
		}

		for (thread &t : _handler)
		{
   
			//等待线程执行完毕
			t.join();
		}
	}
private:
	vector<Thread*> _pool;
	vector<thread> _handler;

	// 把runInThread这个成员方法充当线程函数 thread pthread_create
	void runInThread(int id)
	{
   
		cout << "call runInThread! id:" << id << endl;
	}
};

应用:

int main()
{
   
	ThreadPool pool;
	pool.startPool(10);//创建10个线程
	return 0;
}
#endif

这里只是个概念模型,用还是用不了的。

参考文献

[1] 施磊.腾讯课堂——C++高级.图论科技,2020.7.
全部评论

相关推荐

沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
正在热议
# 25届秋招总结 #
441069次浏览 4495人参与
# 春招别灰心,我们一人来一句鼓励 #
41545次浏览 524人参与
# 北方华创开奖 #
107340次浏览 599人参与
# 地方国企笔面经互助 #
7937次浏览 18人参与
# 同bg的你秋招战况如何? #
75837次浏览 554人参与
# 虾皮求职进展汇总 #
114640次浏览 885人参与
# 阿里云管培生offer #
119980次浏览 2219人参与
# 实习,投递多份简历没人回复怎么办 #
2454217次浏览 34849人参与
# 实习必须要去大厂吗? #
55703次浏览 960人参与
# 提前批简历挂麻了怎么办 #
149846次浏览 1977人参与
# 投递实习岗位前的准备 #
1195775次浏览 18547人参与
# 你投递的公司有几家约面了? #
33182次浏览 188人参与
# 双非本科求职如何逆袭 #
661978次浏览 7394人参与
# 如果公司给你放一天假,你会怎么度过? #
4734次浏览 55人参与
# 机械人春招想让哪家公司来捞你? #
157608次浏览 2267人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11417次浏览 276人参与
# 发工资后,你做的第一件事是什么 #
12467次浏览 61人参与
# 工作中,努力重要还是选择重要? #
35657次浏览 384人参与
# 参加完秋招的机械人,还参加春招吗? #
20096次浏览 240人参与
# 我的上岸简历长这样 #
451947次浏览 8088人参与
# 实习想申请秋招offer,能不能argue薪资 #
39252次浏览 314人参与
# 非技术岗是怎么找实习的 #
155859次浏览 2120人参与
牛客网
牛客企业服务