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

做网站推广利润哪个国家的绘本网站做的好

做网站推广利润,哪个国家的绘本网站做的好,投诉举报网站建设要求,wordpress首页缩略图不显示并发 资源管理 资源 程序中符合先获取后释放#xff08;显式或隐式#xff09;规律的东西#xff0c;比如内存、锁、套接字、线程句柄和文件句柄等。RAII#xff1a; (Resource Acquisition Is Initialization),也称为“资源获取就是初始化”#xff0c;是C语言的一种管…并发 资源管理 资源 程序中符合先获取后释放显式或隐式规律的东西比如内存、锁、套接字、线程句柄和文件句柄等。RAII (Resource Acquisition Is Initialization),也称为“资源获取就是初始化”是C语言的一种管理资源、避免泄漏的惯用法。 unique_ptr shared_ptr unique_ptr 是一个独立对象或者是数组的句柄unique_ptr 通过移动操作使得简单高效shared_ptr 很多方面和unique_ptr 相似 唯一区别是shared_ptr 通过拷贝操作而非移动操作。多个shared_ptr 共享该对象的所有权只有当最后一个 shared_ptr 被销毁时对象才被销毁。 shared_ptr 提供的垃圾回收机制需要慎重使用。 shared_ptr 使得对象的生命周期变得不那么容易掌控了除非在一定程度上一定要使用共享所有权否则别轻易使用shared_ptrshared_ptr 没有指定哪个拥有者有权读写对象当我们使用函数返回集合的时候不必使用指针因为如果定义了移动语义 在返回的时候会默认使用移动操作 并发 任务 和thread 线程(thread)是任务在程序中的系统级表示。thread 在 中定义 thread 的使用方法 #include iostream #include thread #include vector #include config.h// thead 的使用 // 函数的参数这里必须是const 否则会报thread:120:44: error: static assertion failed: std::thread arguments must be invocable after conversion to rvalues // 在多线程中使用io 操作需要考虑线程安全打印出来的字符服务保证输出内容的顺序 void f(const std::vectordouble v) {std::cout function f std::endl; } // 通过res 指针返回thread 的执行结果不美观的方法 // 不推荐使用此方法因为无法掌控res 什么时候写入了一般用消息队列或者使用condition 、promise等方式来实现返回结果 void f2(const std::vectordouble v, double* res) {}struct F {std::vectordouble v;F(std::vectordouble vv):v{vv} {}/* 如果不使用调用运算符重载 会编译报错 hread:120:44: error: static assertion failed: std::thread arguments must be invocable after conversion to rvalues*/void operator()() { // 调用运算符重载std::cout struct F operator std::endl;}};class Foo { public:void bar(){for (int i 0; i 5; i){std::cout 正在执行线程3\n;n;std::this_thread::sleep_for(std::chrono::milliseconds(10));}}int n 0; };int main(int argc, char **argv) {std::vectordouble some_vec {1,2,3,4,5,6};std::vectordouble vec2{10,11,12,13};std::thread t1{f, some_vec}; // 在t1 的线程里面执行函数f, 参数是some_vecstd::thread t2{F{vec2}}; // 在t2 的县城里面执行函数 F 的调用运算符 参数是vec2double res;std::thread t3(f2, some_vec, res);Foo f;std::thread t4(Foo::bar, f); // t5 在对象 f 上运行 foo::bar()t1.join();t2.join();return 0; } thread 更多用法清参照cppreference thread 共享数据 mutex // 访问数据排他处理condition_variable 允许一个thread 等待另外一个thread代码示例 class Message { private:int msgId; public:Message(int id) : msgId(id){}int getId() { return msgId;} };std::queueMessage mMsgQueue; std::condition_variable mCond; std::mutex mMutex;void consumer() {while(true) {//std::cout wait mutex std::endl;std::unique_lockstd::mutex lck{mMutex};//std::cout wait condition std::endl;//while(mCond.wait(lck))/*do nothing*/;mCond.wait(lck);//std::cout after wait condition std::endl;auto m mMsgQueue.front();mMsgQueue.pop();std::cout get msg Id: m.getId() std::endl;// lck.unlock();} }void producer() {int index 10;while(index 0) {Message msg(index);std::unique_lockstd::mutex lck{mMutex};mMsgQueue.push(msg);std::cout push msg Id: msg.getId() std::endl;lck.unlock(); //1mCond.notify_all();//std::cout after notify all: msg.getId() std::endl;//std::this_thread::sleep_for(std::chrono::milliseconds(20)); //2index--;} }int main(int argc, char **argv) {std::thread t2(consumer);std::thread t1(producer);t1.join();t2.join(); }对于生产者-消费者模式理想状态下生产者生产一个消费者就消费一个但是实际并非如此 1 如果不主动调用lck.unlock(), lck 需要等到while(){} 进入下一个循环才会释放所以无论是否加 cosumer 线程得不到执行的契机可能和平台有关2 对于加了1 而没有2 的场合while 很快执行到下一个循环又立即执行到lck 也会导致在producer 执行过程中consumer 得不到执行 执行效果大致如下 而如果加了1 和2后 对于consume 如上图的处理方式获取一次锁只pop 一次数据会因为producer notify 和consumer 的wait 不是时间上不是匹配出现而导致数据没有被全部读取出来可以修改为如下方式 在获取到一次锁后把消息队列中的消息全部处理掉 void consumer() {while(true) {//std::cout wait mutex std::endl;std::unique_lockstd::mutex lck{mMutex};//std::cout wait condition std::endl;//while(mCond.wait(lck))/*do nothing*/;mCond.wait(lck);//std::cout after wait condition std::endl;while(!mMsgQueue.empty()) {auto m mMsgQueue.front();mMsgQueue.pop();std::cout get msg Id: m.getId() std::endl;}// lck.unlock();} }执行效果大致如下 这样只是消费者不会立马消费掉生产者生产的数据但是即使没有12也不会导致消息得不到处理 任务通信 c 中主要提供了以下三种都定义在 头文件中。 future and promise 用来从一个独立线程上创建出的任务返回结果packaged_task 是帮助启动义务以及链接返回结果的机制async 以非常类似调用函数的方式启动一个任务 future and promis 允许两个任务间传输直而无须显示使用锁–“系统”高效地实现了这种传输。 当一个任务需要向另一个任务传输这个值时把它放入promise。c 实现会出现在对应的future 中。使用future 的get()函数如果值还未准备好线程会阻塞直至值准备好。如果get( )无法计算出来get()会抛一个异常系统或者从get() 得到数据的任务promise 的作用主要为future的get() 提供放置 操作set_value()) 和set_exception(). #include iostream #include thread #include future #include functional void work (std::promiseint px) {try {px.set_value(11);} catch (...) {px.set_exception(std::current_exception());} }void result (std::futureint res) {try {int result res.get();std::cout recieve the result: result std::endl;} catch(...) {//std::coutexception std::current_exception() std::endl;} } int main(int argc, char **argv) {std::promiseint pro;std::futureint fut pro.get_future(); //binding the future and the promisestd::thread t1(work, std::ref(pro));std::thread t2(result, std::ref(fut));t1.join();t2.join();return 0; } 可以看到使用步骤如下 声明promise定义future并且绑定promise 和future 二者的模板类型必须一致很好理解provise 设定的就是传给future 的使用promise 的set_value或者set_exception 传递值使用future 的get() 函数接收值(注意get是阻塞的) 这里使用了std::ref std::ref的使用场景 算法传递可调用对象而这些对象可能需要引用传递。在多线程之间共享数据但有希望通过引用传递数据而不是复制。std::ref可以使函数接受任何类型的引用而不仅仅是特定类型 packaged_task packaged_task 简化了任务连接future promise.TODO
http://www.eeditor.cn/news/123073/

相关文章:

  • 网站直接访问建设部网站法律法规
  • 做铝材的网站农业电商网站有哪些
  • 100款免费软件网站大全wordpress如何做页面模板下载地址
  • 品牌网站怎么建立自己怎么建设手机网站
  • 怎样做网站手机客户端帮别人起名 做ppt的网站
  • 网站模板 整站源码友谊平台
  • 寻找扬中网站建设wordpress不显示作者评论
  • 好的培训网站模板wordpress pot文件
  • 做网站小代码大全自助网站建设公司电话
  • 诸暨北京有哪些网站制作公司列表网网站建设
  • 我做的网站怎样被百度收录微信开发一个小程序多少钱
  • 什么行业必须做网站郑州网站建设 天强科技
  • 泰州做网站的个人建设网站教程
  • 网页设计与网站建设 pdf深圳食品网站建设
  • 网站怎么更换页面图片杭州品牌策划
  • 如何知道网站是用什么语言做的浙江省住建和城乡建设厅官方网站
  • 苏州高校网站建设建议南京的电商网站设计
  • 做搜狗pc网站点平面设计网课哪个机构好
  • 建设公司网站大概需要多少钱?江苏财经职业技术学院会计系示范校建设专题网站
  • 专业做网站app的公司西安建网站
  • 查pv uv的网站加强政协网站建设
  • 网站开发的步骤过程帝国cms怎么做网站
  • 广州市网站建设怎么样无锡做网站专业的公司
  • 宁夏建设职业技术学院成绩查询网站营口网站制作公司
  • 三门峡高端网站建设wordpress分类目录伪静态
  • 若要使用链接目标在新窗口打开沈阳网站seo
  • 长春网站优化教程企业信息化建设网站
  • 海贼王路飞和女帝做的网站高端企业网站定制公司
  • 西安的电商平台网站建设深圳网站建设公司怎么做
  • 创意专业网站建设做网站的不给源文件