百度春招一面

好像是AI应用技术部

问了C++部署自然语言处理算法的一个项目

问了一些八股

比较深度的是哈希表解决冲突的方法对应情况下删除key的情况

问了一下unorder_map的hash冲突解决,应该是基于链地址法,当时没想到

后面写题,写一个线程池,给任务队列中添加计算任务,要求实现异步获取计算结果

//线程池,执行特定任务 
 
#include<bits/stdc++.h>
using namespace std;

class Threadpool{
	public:
		Threadpool(int count):thread_count(count),pool_(make_shared<Pool>()){
			for(int i = 0; i < thread_count; ++i){
				thread([pool = pool_](){
					unique_lock<mutex> locker(pool->mtx);
					while(1){
					if(!pool->q.empty()){
						auto task = move(pool->q.front());
						pool->q.pop();
						locker.unlock();
						task();
						cout << "111" << endl;
						locker.lock();
                        
					}
					else{
						pool->cond.wait(locker);
					}
				}		
			}).detach();
		   }
	    }
	    template<class T>
	    void add(T&& task){
	  	     lock_guard<mutex> locker(pool_->mtx);
	    	 pool_->q.emplace(forward<T>(task));
	    	 pool_->cond.notify_one();
		}
	private:
		struct Pool{
			mutex mtx;
			condition_variable cond;
			queue<function<void()>> q;
		};
		shared_ptr<Pool> pool_;
		int thread_count; 
};


void sum(int a, int b){
	 cout << a + b << endl;
}

void test(){
	 Threadpool* mypool = new Threadpool(8);
	 mypool->add(move(bind(&sum,3,4)));
	 mypool->add(move(bind(&sum,2,1)));
}
int main(){
	test();
	return 0;
} 

异步的实现应该基于future和promise或者async来实现,但自己记不清楚怎么样用了,就随便写了上面的代码。

后面复习了下async和future,实现了一下异步的

//线程池,执行特定任务 
 
#include<bits/stdc++.h>
using namespace std;

class Threadpool{
	public:
		Threadpool(int count):thread_count(count),pool_(make_shared<Pool>()){
			for(int i = 0; i < thread_count; ++i){
				thread([pool = pool_,this](){
					unique_lock<mutex> locker(pool->mtx);
					while(1){
					if(!pool->q.empty()){
						auto task = move(pool->q.front());
						pool->q.pop();
						locker.unlock();
						//使用async异步运行task 
						future<int> future = async(task);
						pool->futurelist.push_back(move(future));
						//task();
						cout << "111" << endl;
						locker.lock();
                        
					}
					else{
						pool->cond.wait(locker);
					}
				}		
			}).detach();
		   }
	    }
	    template<class T>
	    void add(T&& task){
	    	lock_guard<mutex> locker(pool_->mtx);
	    	 pool_->q.emplace(forward<T>(task));
	    	 pool_->cond.notify_one();
		}

		struct Pool{
			mutex mtx;
			condition_variable cond;
			queue<function<int()>> q;
			//用来存每次async运行对应的future 
			vector<future<int>> futurelist;
		};
		shared_ptr<Pool> pool_;
		int thread_count; 
};


int sum(int a, int b){
	 //cout << a + b << endl;
	 return a+b;
}


void test(){
	 Threadpool* mypool = new Threadpool(8);
	 mypool->add(move(bind(&sum,3,4)));
	 mypool->add(move(bind(&sum,2,1)));
	 for(auto &f : mypool->pool_->futurelist){
	 	cout << "异步运算结果为:" << f.get() << endl; 
	 } 
}
int main(){
	test();
	return 0;
} 

全部评论
unlock不是应该在task之前吗
1 回复 分享
发布于 2023-03-16 12:09 江苏
请问是什么岗位?
1 回复 分享
发布于 2023-03-16 09:51 美国
有二面的消息嘛
点赞 回复 分享
发布于 2023-03-19 02:57 湖南
好难…
点赞 回复 分享
发布于 2023-03-16 11:33 陕西
点赞 回复 分享
发布于 2023-03-16 08:49 北京

相关推荐

不愿透露姓名的神秘牛友
07-16 18:05
何尝不是一种学历歧视呢
下午吃泡馍:这种公司不投也罢,不过建议挂出公司名字,1.1w就应激到问是不是清北也是看得出来不是啥好公司了,估计这hr也没见过啥世面
点赞 评论 收藏
分享
07-11 22:27
中南大学 Java
程序员牛肉:学历的话没问题。但是没问题的也就只有学历了。 其实你的整体架构是正确的,博客接着干。但是项目有点过于简单了。从后端的角度上讲,你这也就是刚入门的水平,所以肯定约面试够呛。 如果你要应聘后端岗位,那你第一个项目竟然是仿写操作系统。这个你要面试官咋问你。你一定要记住一点,你简历上写的所有的东西,都是为了证明你有能力胜任当前的岗位,而不是为了证明你自己会什么。 如果你只是浅浅的做几个项目,描述也都是烂大街。技术点也都是各种混水类的配置类需求,那你就不要幻想自己能走多远。一定要保持思考,保持学习。
点赞 评论 收藏
分享
评论
1
18
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务