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

如何建设一个视频网站seo顾问招聘

如何建设一个视频网站,seo顾问招聘,wordpress评论分页不显示,微信建微网站本文介绍 atomic 头文件中最简单的原子类型: atomic_flag。atomic_flag 一种简单的原子布尔类型#xff0c;只支持两种操作#xff0c;test_and_set 和 clear。 std::atomic_flag 详解 std::atomic_flag 构造函数 std::atomic_flag 构造函数如下#xff1a; ato…本文介绍 atomic 头文件中最简单的原子类型: atomic_flag。atomic_flag 一种简单的原子布尔类型只支持两种操作test_and_set 和 clear。 std::atomic_flag 详解 std::atomic_flag 构造函数 std::atomic_flag 构造函数如下 atomic_flag() noexcept default; atomic_flag (const atomic_flagT) delete;std::atomic_flag 只有默认构造函数拷贝构造函数已被禁用因此不能从其他的 std::atomic_flag 对象构造一个新的 std::atomic_flag 对象。 如果在初始化时没有明确使用 ATOMIC_FLAG_INIT初始化那么新创建的 std::atomic_flag 对象的状态是未指定的unspecified既没有被 set 也没有被 clear。另外atomic_flag 不能被拷贝也不能 move 赋值。 ATOMIC_FLAG_INIT: 如果某个 std::atomic_flag 对象使用该宏初始化那么可以保证该 std::atomic_flag 对象在创建时处于 clear 状态。 下面先看一个简单的例子main() 函数中创建了 10 个线程进行计数率先完成计数任务的线程输出自己的 ID后续完成计数任务的线程不会输出自身 ID #include iostream // std::cout #include atomic // std::atomic, std::atomic_flag, ATOMIC_FLAG_INIT #include thread // std::thread, std::this_thread::yield #include vector // std::vectorstd::atomicbool ready(false); // can be checked without being set std::atomic_flag winner ATOMIC_FLAG_INIT; // always set when checkedvoid count1m(int id) {while (!ready) { std::this_thread::yield();} // 等待主线程中设置 ready 为 true.for (int i 0; i 1000000; i) {} // 计数.// 如果某个线程率先执行完上面的计数过程则输出自己的 ID.// 此后其他线程执行 test_and_set 是 if 语句判断为 false// 因此不会输出自身 ID.if (!winner.test_and_set()) {std::cout thread # id won!\n;} };int main() {std::vectorstd::thread threads;std::cout spawning 10 threads that count to 1 million...\n;for (int i 1; i 10; i)threads.push_back(std::thread(count1m, i));ready true;for (auto th:threads)th.join();return 0; }多次执行结果如下 atomic ) ./Atomic-Flag1 spawning 10 threads that count to 1 million... thread #6 won! atomic ) ./Atomic-Flag1 spawning 10 threads that count to 1 million... thread #1 won! atomic ) ./Atomic-Flag1 spawning 10 threads that count to 1 million... thread #5 won! atomic ) ./Atomic-Flag1 spawning 10 threads that count to 1 million... thread #1 won! atomic ) ./Atomic-Flag1 spawning 10 threads that count to 1 million... thread #1 won! atomic ) ./Atomic-Flag1 spawning 10 threads that count to 1 million... thread #10 won!test_and_set 介绍 std::atomic_flag 的 test_and_set 函数原型如下 bool test_and_set (memory_order sync memory_order_seq_cst) volatile noexcept; bool test_and_set (memory_order sync memory_order_seq_cst) noexcept;test_and_set() 函数检查 std::atomic_flag 标志如果 std::atomic_flag 之前没有被设置过则设置 std::atomic_flag 的标志并返回先前该 std::atomic_flag 对象是否被设置过如果之前 std::atomic_flag 对象已被设置则返回 true否则返回 false。 test-and-set 操作是原子的因此 test-and-set 是原子 read-modify-write RMW操作。 test_and_set 可以指定 Memory Order(后续的文章会详细介绍 C11 的 Memory Order此处为了完整性列出 test_and_set 参数 sync 的取值)取值如下 Memory Order 值Memory Order 类型memory_order_relaxedRelaxedmemory_order_consumeConsumememory_order_acquireAcquirememory_order_releaseReleasememory_order_acq_relAcquire/Releasememory_order_seq_cstSequentially consistent 一个简单的例子 #include iostream // std::cout #include atomic // std::atomic_flag #include thread // std::thread #include vector // std::vector #include sstream // std::stringstreamstd::atomic_flag lock_stream ATOMIC_FLAG_INIT; std::stringstream stream;void append_number(int x) {while (lock_stream.test_and_set()) {}stream thread # x \n;lock_stream.clear(); }int main() {std::vector std::thread threads;for (int i 1; i 10; i)threads.push_back(std::thread(append_number, i));for (auto th:threads)th.join();std::cout stream.str() std::endl;;return 0; }执行结果如下 thread #1 thread #2 thread #3 thread #4 thread #5 thread #6 thread #7 thread #8 thread #9 thread #10clear() 介绍 清除 std::atomic_flag 对象的标志位即设置 atomic_flag 的值为 false。clear 函数原型如下 void clear (memory_order sync memory_order_seq_cst) volatile noexcept; void clear (memory_order sync memory_order_seq_cst) noexcept;清除 std::atomic_flag 标志使得下一次调用 std::atomic_flag::test_and_set 返回 false。 std::atomic_flag::clear() 可以指定 Memory Order(后续的文章会详细介绍 C11 的 Memory Order此处为了完整性列出 clear 参数 sync 的取值)取值如下 Memory Order 值Memory Order 类型memory_order_relaxedRelaxedmemory_order_consumeConsumememory_order_acquireAcquirememory_order_releaseReleasememory_order_acq_relAcquire/Releasememory_order_seq_cstSequentially consistent 结合 std::atomic_flag::test_and_set() 和 std::atomic_flag::clear()std::atomic_flag 对象可以当作一个简单的自旋锁使用请看下例 #include thread #include vector #include iostream #include atomicstd::atomic_flag lock ATOMIC_FLAG_INIT;void f(int n) {for (int cnt 0; cnt 100; cnt) {while (lock.test_and_set(std::memory_order_acquire)) // acquire lock; // spinstd::cout Output from thread n \n;lock.clear(std::memory_order_release); // release lock} }int main() {std::vectorstd::thread v;for (int n 0; n 10; n) {v.emplace_back(f, n);}for (auto t : v) {t.join();} }在上面的程序中std::atomic_flag 对象 lock 的上锁操作可以理解为 lock.test_and_set(std::memory_order_acquire); (此处指定了 Memory Order更多有关 Memory Order 的概念我会在后续的文章中介绍)解锁操作相当与 lock.clear(std::memory_order_release)。 在上锁的时候如果 lock.test_and_set 返回 false则表示上锁成功此时 while 不会进入自旋状态因为此前 lock 的标志位为 false(即没有线程对 lock 进行上锁操作)但调用 test_and_set 后 lock 的标志位为 true说明某一线程已经成功获得了 lock 锁。 解锁操作非常简单直接调用 lock.clear() 即可此后其他线程可以继续对该 std::atomic_flag 对象(lock)进行上锁和解锁操作。 如果在该线程解锁即调用 lock.clear(std::memory_order_release) 之前另外一个线程也调用 lock.test_and_set(std::memory_order_acquire) 试图获得锁则 test_and_set(std::memory_order_acquire) 返回 true则 while 进入自旋状态。如果获得锁的线程解锁即调用了 lock.clear(std::memory_order_release)之后另外某个线程试图调用 lock.test_and_set(std::memory_order_acquire) 并且返回 false则 while 不会进入自旋此时该线程也成功地获得了锁。 按照上面的分析我们知道在某种情况下 std::atomic_flag 对象可以当作一个简单的自旋锁使用。
http://www.zqtcl.cn/news/472276/

相关文章:

  • 长沙 网站设计 公司价格江苏专业网站建设费用
  • 做的好的手机网站有哪些内容手机怎么做app详细步骤
  • net网站开发参考文献c++能不能作为网页开发语言
  • 我公司让别人做网站了怎么办厦门logo设计公司
  • 闸北专业做网站怎么判断网站优化过度
  • 搭建网站seowordpress重新安装如何做
  • 网站设计优化重庆教育建设有限公司网站
  • 域名注册网站查询手工制作视频教程简单又漂亮
  • 书画院网站源码网站百度指数
  • 网页设计与网站开发第三版课后答案网络运营商是干嘛的
  • wordpress分类目录网站主题自己做营销型网站
  • 简述网站推广的五要素seo排名软件怎么做
  • 做网站能做职业吗织梦如何做几种语言的网站
  • 手机网站定制咨询如何修改网站
  • 长沙大型网站建设公司建站工作室源码
  • 找设计方案的网站专注南昌网站建设
  • UE做的比较好的网站汕头网站关键词优化教程
  • 做羞羞的事情网站广州番禺招聘网最新招聘信息
  • 网站基础开发成本网站建设策划包括哪些内容
  • 商务网站建设哪家好绍兴网站建设做网站
  • 网站域名管理东莞网页设计和网页制作
  • 网站建设与制作报价网站app制作
  • 下载可以做动漫的我的世界视频网站长沙网站seo技巧
  • 汕头网站制作推荐制作影视视频的软件
  • 定制程序网站宁波英文网站建设
  • 安康公司做网站网页设计怎么设计
  • 小型企业网站系统南京seo外包平台
  • 曲靖网站制作邢台网站制作那家便宜
  • wordpress中portfolio重庆网站seo按天计费
  • 做淘客网站需要多大的空间工程公司名称大全简单大气