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.
全部评论

相关推荐

11-28 17:58
门头沟学院 Java
美团 JAVA开发 n×15.5
牛客786276759号:百度现在晋升很难的 而且云这块的业务没美团好 你看百度股价都跌成啥样了
点赞 评论 收藏
分享
尊嘟假嘟点击就送:加v细说,问题很大
点赞 评论 收藏
分享
霁华Tel:秋招结束了,好累。我自编了一篇对话,语言别人看不懂,我觉得有某种力量在控制我的身体,我明明觉得有些东西就在眼前,但身边的人却说啥也没有,有神秘人通过电视,手机等在暗暗的给我发信号,我有时候会突然觉得身体的某一部分不属于我了。面对不同的人或场合,我表现出不一样的自己,以至于都不知道自己到底是什么样子的人。我觉得我已经做的很好,不需要其他人的建议和批评,我有些时候难以控制的兴奋,但是呼吸都让人开心。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
正在热议
# 25届秋招总结 #
443735次浏览 4528人参与
# 春招别灰心,我们一人来一句鼓励 #
42340次浏览 539人参与
# 阿里云管培生offer #
120530次浏览 2222人参与
# 地方国企笔面经互助 #
7980次浏览 18人参与
# 同bg的你秋招战况如何? #
77401次浏览 569人参与
# 实习必须要去大厂吗? #
55833次浏览 961人参与
# 北方华创开奖 #
107498次浏览 600人参与
# 虾皮求职进展汇总 #
116568次浏览 887人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11726次浏览 292人参与
# 实习,投递多份简历没人回复怎么办 #
2455118次浏览 34862人参与
# 提前批简历挂麻了怎么办 #
149972次浏览 1979人参与
# 在找工作求抱抱 #
906157次浏览 9423人参与
# 如果公司给你放一天假,你会怎么度过? #
4765次浏览 55人参与
# 你投递的公司有几家约面了? #
33210次浏览 188人参与
# 投递实习岗位前的准备 #
1196098次浏览 18551人参与
# 机械人春招想让哪家公司来捞你? #
157652次浏览 2267人参与
# 双非本科求职如何逆袭 #
662434次浏览 7397人参与
# 发工资后,你做的第一件事是什么 #
12817次浏览 62人参与
# 工作中,努力重要还是选择重要? #
35967次浏览 384人参与
# 简历中的项目经历要怎么写? #
86958次浏览 1517人参与
# 参加完秋招的机械人,还参加春招吗? #
20158次浏览 240人参与
# 我的上岸简历长这样 #
452090次浏览 8089人参与
牛客网
牛客企业服务