百度春招一面

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

相关推荐

大方的大熊猫准备进厂:1.教育背景:你希望从事什么专业的工作你的主修课就是什么;成绩优秀是你应该做的,没什么可描述的,成绩不优秀也许人家在大学忙着创业呢?(成绩优秀不一定是好事,只能说明多元化的大学你上成了高中,没有真正上明白大学,反而体现了你死板,不爱社交,没有别的突出能力) 2.实践经历:你想表达的意思没有说清楚。你是说你会个性化服务,还是你有实习经历。如果没有带来,经济收益,表彰,更好的发展前景,那你还不如说说提升了自己哪些技能。你说有人给你送锦旗我都能明白你优秀,但是你说你会xxxx,你说这话谁信,证据呢。 3.入伍经历:你描述的就是你的工作职责或者你应该做的,并没有体现出来你把这个事情做好了,而且入伍经历并不能证明你能干好你要应聘的工作,不如只写经历其余所有内容都不写。 4.荣誉技能:重点突出一下,但不要过多描述,这些荣誉的含金量懂得都懂。 重点:你要应聘什么工作(具体岗位,实习生不具体),你的期望薪资
点赞 评论 收藏
分享
牛客383479252号:9,2学生暑期实习失利开始投小厂,给这群人整自信了
点赞 评论 收藏
分享
评论
1
18
分享

创作者周榜

更多
牛客网
牛客企业服务