百度春招一面

好像是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 北京

相关推荐

就前几天旅游的时候,打开抖音就经常刷到这类视频:以前是高学历学生、老师、主持人,现在做着团播、擦边主播的工作,以及那些经过精心包装的“职业转型”故事——从铺天盖地的VLOG到所谓的“04年夜场工作日记”,这些内容在初中升学、高考放榜等关键时间节点持续发酵。可以说非常直接且精准地在潜移默化地影响着心智尚未成熟的青少年,使其对特殊行业逐渐脱敏。那我就想问了:某些传播公司、平台运营者甚至某些夜场的老板,你们究竟在传递怎样的价值观?点开那些视频,评论区里也是呈现明显的两极分化:一种是​​经济下行论​​:“现在就业市场已经艰难到这种程度了吗?”​​一种是事实反驳派​​:这些创作者往往拥有名校背景,从事着...
牛客刘北:被环境教育的,为了能拿到足够的钱养活自己,不甘心也得甘心,现在的短视频传播的思想的确很扭曲,但是很明显,互联网玩上一年你就能全款提A6,但你全心全意不吃不喝工作一年未必能提A6,但是在高考中考出现这个的确很扭曲,在向大家传播“不上学,玩互联网也可以轻松年入百万”,不是人变了,是社会在变
预测一下26届秋招形势
点赞 评论 收藏
分享
评论
1
18
分享

创作者周榜

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