当前位置: 首页 > news >正文

网站集约化建设的讲话产品宣传网站的重点

网站集约化建设的讲话,产品宣传网站的重点,wordpress主页设置,网站策划的工作职责介绍 提交任务函数submitTask中返回的Result类型应该是用Result类包装当前的task#xff0c;因为出函数之后task即如下形式#xff1a;return Result(task); Result和Task都要互相持有对方的指针#xff0c;Task要将任务执行结果通过Result::setVal(run()) 调用传给其对应…介绍 提交任务函数submitTask中返回的Result类型应该是用Result类包装当前的task因为出函数之后task即如下形式return Result(task); Result和Task都要互相持有对方的指针Task要将任务执行结果通过Result::setVal(run()) 调用传给其对应Result对象。 Result类的声明和实现如下 // threadpool.h // 提交到线程池的task任务执行完成后的返回值类型 class Result { public:Result(std::shared_ptrTask task, bool isValid true);~Result() default;//获取任务执行后的返回值void setVal(Any any);// get方法用户调用这个方法获取task的返回值Any get(); private:Any any_; // 存储任务的返回值Semaphore sem_; // 线程通信std::shared_ptrTask task_; // 指向对应获取返回值的任务对象std::atomic_bool isValid_; // 检查返回值是否有效 };// threadpool.cpp Result::Result(std::shared_ptrTask task, bool isValid): isValid_(isValid), task_(task) {task-setResult(this); }//获取任务执行后的返回值 void Result::setVal(Any any) {// 存储task的返回值this-any_ std::move(any); // Any 类只提供右值拷贝和移动赋值函数sem_.post(); // 获取任务的返回值增加信号量资源 }// get方法用户调用这个方法获取task的返回值 Any Result::get() {if (!isValid_){return ;}sem_.wait(); // task任务如果没执行完这里会阻塞用户线程return std::move(any_); // Any不提供左值拷贝构造和拷贝赋值 }Task类的声明和实现如下 // threadpool.h class Task { public:Task();~Task() default;void exec();void setResult(Result* res);// 用户可自定义任务类型从Task派生出来重写run方法实现自定义任务处理virtual Any run() 0;private:// 不要用智能指针可能会导致和Result产生循环引用的问题Result* result_; // Result对象生命周期 Task对象生命周期 }; // threadpool.cpp Task::Task(): result_(nullptr) {} void Task::exec() {if (nullptr ! result_){result_-setVal(run()); // !!!}}void Task::setResult(Result* res) {result_ res; }Master-Slave线程模型 Master线程用来分解任务然后给各个Slave分配任务 等待各个Slave线程执行完任务返回结果 Master线程合并各个任务结果并输出 测试 使用3个线程来计算12…300000000 的和1加到3亿 测试代码如下 #include iostream #include chrono #include threadpool.husing uLong unsigned long long;class MyTask : public Task { public:MyTask(uLong /*int*/ begin, uLong /*int*/ end): begin_(begin), end_(end){}Any run(){std::cout tid: std::this_thread::get_id() begin! std::endl;//std::this_thread::sleep_for(std::chrono::seconds(5));uLong sum 0;for (uLong i begin_; i end_; i){sum i;}std::cout tid: std::this_thread::get_id() end! std::endl;return sum;} private:uLong /*int*/ begin_;uLong /*int*/ end_; }; int main() {ThreadPool pool;pool.start(4);Result res1 pool.submitTask(std::make_sharedMyTask(1, 1000000000));Result res2 pool.submitTask(std::make_sharedMyTask(1000000001, 2000000000));Result res3 pool.submitTask(std::make_sharedMyTask(2000000001, 3000000000));uLong sum1 res1.get().cast_uLong();uLong sum2 res2.get().cast_uLong();uLong sum3 res3.get().cast_uLong();// Master - Slave线程模型std::cout (sum1 sum2 sum3) std::endl;getchar();return 0; } 出现的问题 测试时最后一个获取任务的线程没有执行完成 而且似乎出现了死锁的现象按任意键无反应 分析 根据卡住的位置我简单的推测是第三个任务执行的问题于是在提交第三个子任务处打上断点 到达断点后进入MyTask构造函数在初始化列表发现end_成员被初始化为负数如下图 这是由于int类型的最大值在编译器中定义如下 #define INT_MAX 2147483647小于3000000000导致了溢出从而转变成负数。 这样导致在如下的任务执行函数的循环中程序永远无法出循环 解决办法 将MyTask类中的成员类型改变为unsigned long long class MyTask : public Task { public:MyTask(uLong /*int*/ begin, uLong /*int*/ end): begin_(begin), end_(end){}Any run(){std::cout tid: std::this_thread::get_id() begin! std::endl;//std::this_thread::sleep_for(std::chrono::seconds(5));uLong sum 0;for (uLong i begin_; i end_; i){sum i;}std::cout tid: std::this_thread::get_id() end! std::endl;return sum;} private:uLong /*int*/ begin_;uLong /*int*/ end_; };程序运行后结果正确
http://www.hkea.cn/news/14353928/

相关文章:

  • 网站建设合作加盟设计一个网站要多久
  • 网站建设图片轮播手机网站建设开发
  • 广州网站平台建设国外优秀摄影作品网站
  • 网站的域名解析怎么做个人网页生成
  • 免费空间asp网站爱空间家装怎么样?两点告诉你
  • 深圳网站制作公司讯息公司简介结尾怎么写
  • 温州门户网站建设专注专业网站建设
  • 自己的域名可以转给做网站的账号吗阿里巴巴网站怎么做推广方案
  • 整站seo策略实施建网站哪家好北京
  • 建设综合购物网站微信里面如何做网站
  • 官方重大项目建设库网站做网站需要几个程序
  • 网站建设运作流程wordpress可视化编辑器 windows
  • 青海公路建设市场信用信息服务网站视频直播网站建设方案
  • html5网站开发需要框架吗主机屋网站
  • 赣州网站建设费用杭州市建设信用网官网
  • 如何做网站费用多少能做游戏的软件
  • 做物流的都是上什么网站企业网络推广的方法
  • 企业网站个人备案吗外贸网站建站i
  • 建设一个网站的技术可行性研究怎么建设网站模板上传
  • 惠州企业网站seo公司网站建设与维护薪资
  • 营销网站优化seowordpress外贸网站
  • html的网站模板做dj网站能赚钱吗
  • 做号网站网站售后维护
  • 设计接单网站大全国外好的设计网站有哪些
  • 专业集团门户网站建设赣州深科网站建设
  • 网站创建需要多少钱电子商务网站建设试题3
  • 网站程序定制wordpress 主题 love
  • 免费下载代码项目的网站自己的网站怎么做app吗
  • 安康企业网站建设价格重庆快速网站建设平台
  • 网站设计收费模式综合网站设计