百度春招一面

好像是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;
} 

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

相关推荐

11-08 13:58
门头沟学院 Java
程序员小白条:竟然是蓝桥杯人才doge,还要花钱申领的offer,这么好的公司哪里去找
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-24 20:55
阿里国际 Java工程师 2.7k*16.0
程序员猪皮:没有超过3k的,不太好选。春招再看看
点赞 评论 收藏
分享
1 18 评论
分享
牛客网
牛客企业服务