如何有效使用网站后期推广方案中的网页图片提取器?
摘要:网站后期推广方案,网页图片提取器,深圳有哪些网站公司,全国最好的加盟网站这是之前有做的一个可以接受用户传入任意类型的任务函数和任意参数,并且能拿到任务对应返回值的一个线程池框架,可
网站后期推广方案,网页图片提取器,深圳有哪些网站公司,全国最好的加盟网站这是之前有做的一个可以接受用户传入任意类型的任务函数和任意参数#xff0c;并且能拿到任务对应返回值的一个线程池框架#xff0c;可以链接成动态库#xff0c;用在相关项目里面。一共实现了两版#xff0c;都是支持fixed和cached模式的#xff0c;半同步半异步的…这是之前有做的一个可以接受用户传入任意类型的任务函数和任意参数并且能拿到任务对应返回值的一个线程池框架可以链接成动态库用在相关项目里面。一共实现了两版都是支持fixed和cached模式的半同步半异步的生产者消费者模型异步 提交任务获取任务结果用future类达到异步
今天就简单稍微做个小结。 第一版
1、自己实现Any类用来接收任意函数和传递参数
2、怎么拿到返回值结果和结果类型Result类里面 有Any类成员函数get 用来获取函数返回结果Result构造函数里有Task类型对象能接收到用户传入参数和类型通过setvalue设置拿到返回值类型通过getvalue获取task的返回值最后返回一个Result类型打包的对象用来接收用户提交任务之后的返回值
3、用继承 重写虚函数的方式定义Task任务类为抽象基类用户设置自己的mtask类自己实现里面run方法线程怎么工作
4、自己用mutex和condition_variable实现了信号量类
5、线程池析构必须等所有线程把工作做完之后再析构
非必现的死锁问题有时候线程资源释放回收之后会有线程没有回收干净 对于在阻塞队列里面没有拿到锁的休眠线程和正在工作的线程没有问题因为少考虑了一种情况当threadpool要析构的时候有线程执行完任务又绕了一圈进到while阻塞到拿锁那块当threadpool析构执行到最后面释放锁的时候因为用的都是一把锁此时阻塞在锁的那个线程就拿到锁往下执行但是会执行到notempty wait的地方因为此时队列里线程还有他的存在不空但是析构函数已经走到最后面了没人唤醒他他就一直睡死在里面notempty wait这块了
问题就是notempty wait这块没人notify唤醒了锁加双重判断和把notify和获取锁代码位置换一下 还出现一个死锁问题在linux平台下资源无法释放完全因为linux下底层条件变量调用实现和windows不同linux下condition_variable中notify阻塞了查看源码发现在vs下条件变量析构会释放相关资源而linux下的析构函数什么也没有做并没有释放资源我们调用默认的析构linux下肯定就会有问题解决问题在信号量类多加一个原子bool类型构造的时候初始化false重写析构将bool置为true。在信号量里post操作里加一层bool判断分析定位问题主要通过gdb attach到正在运行的进程通过info threadsthread tidbt等命令查看各个线程的调用 堆栈信息结合项目代码定位到发生死锁的代码片段分析死锁问题发生的原因第二版 简化了代码引入future类和packaged_task打包 packaged_task 调用get_future 获取 future 然后通过 future 异步可以获取函数的返回值使用可变参模板代替Any类
future-我们写的result类
