热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

c++11atomic的使用详解

这篇文章主要介绍了c++11atomic的使用详解,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下

std::atomic_flag

  std::atomic_flag是一个原子的布尔类型,可支持两种原子操作:

  • test_and_set, 如果atomic_flag对象被设置,则返回true; 如果atomic_flag对象未被设置,则设置之,返回false
  • clear. 清楚atomic_flag对象

  std::atomic_flag可用于多线程之间的同步操作,类似于linux中的信号量。使用atomic_flag可实现mutex.

#include 
#include 
#include 
#include 
#include 

std::atomic_flag lock = ATOMIC_FLAG_INIT;
std::stringstream stream;

void append_numer(int x)
{
 while (lock.test_and_set());
 stream <<"thread#" < ths;
 for (int i=0; i<10; i++)
  ths.push_back(std::thread(append_numer, i));
 for (int i=0; i<10; i++)
  ths[i].join();
 std::cout <

std::atomic

  std::atomic对int, char, bool等数据结构进行原子性封装,在多线程环境中,对std::atomic对象的访问不会造成竞争-冒险。利用std::atomic可实现数据结构的无锁设计。

#include 
#include 
#include 
#include 
#include 

std::atomic ready(false);
std::atomic_flag winner = ATOMIC_FLAG_INIT;

void count1m(int i)
{
 while (!ready);
 for (int i=0; i<1000000; i++);
 if (!winner.test_and_set())
  std::cout <<"winner: " < ths;
 for (int i=0; i<10; i++)
  ths.push_back(std::thread(count1m, i));
 ready = true;
 for (int i=0; i<10; i++)
  ths[i].join();
 return 0;
}

  在上例中,执行read=true之后,所有线程结束空等。winner被初始化为ATOMIC_FLAG_INIT,最先执行winner.test_and_set并返回false的线程为winner。

#include 
#include 
#include 
#include 
#include 

std::atomic foo(0);

void set_foo(int x)
{
 foo = x;
}

void print_foo()
{
 while (foo == 0)
 {
  std::this_thread::yield();
 }
 std::cout <<"x: " <

  在上例总,set_foo用于设置atomic对象的值,print_foo用于打印atomic对象的值。std::atomic对象的值的读取和写入可使用load和store实现。

#include 
#include 
#include 
#include 
#include 
#include 
#include 

std::atomic foo(0);
std::atomic_flag lock = ATOMIC_FLAG_INIT;

void add_foo()
{
 while (1) 
 {
  foo++;
  // foo = foo + 1;
  while (lock.test_and_set());
  std::cout <<"add: " <

  atomic支持++和--的原子操作。

以上就是c++11 atomic的使用详解的详细内容,更多关于c++11 atomic的使用的资料请关注其它相关文章!


推荐阅读
  • iTOP4412开发板QtE5.7源码编译指南
    本文详细介绍了如何在iTOP4412开发板上编译QtE5.7源码,包括所需文件的位置、编译器设置、触摸库编译以及QtE5.7的完整编译流程。 ... [详细]
  • NFS(Network File System)即网络文件系统,是一种分布式文件系统协议,主要用于Unix和类Unix系统之间的文件共享。本文详细介绍NFS的配置文件/etc/exports和相关服务配置,帮助读者理解如何在Linux环境中配置NFS客户端。 ... [详细]
  • Java与JSON互转:实现JSON到Java对象及Java对象到JSON的转换
    本文详细介绍了如何在Java中实现JSON数据与Java对象之间的相互转换,包括代码示例和常见问题解决方法。 ... [详细]
  • 本文详细介绍了ActivityManagerService (AMS) 的工作原理及其在Android系统中的重要角色。AMS作为system_server进程的一部分,在系统启动时加载,负责管理和协调应用程序中的Activity和服务(Service)。文章将通过具体的接口图和通信流程,帮助读者更好地理解AMS的工作机制。 ... [详细]
  • 本文介绍了一个使用 C++ 实现的进度条功能,通过自定义函数指针和控制台输出来展示任务完成的进度。 ... [详细]
  • 如何恢复CAD中意外丢失的图纸数据
    当使用CAD进行绘图时,因突然断电或其他原因导致计算机关闭可能会造成工作数据的丢失。然而,通过利用CAD软件的自动保存功能,用户通常能够恢复至最近一次自动保存的数据状态。 ... [详细]
  • 本文介绍了一系列针对iPhone 6s的优化方法,包括系统版本选择、内存管理、软件卸载以及特定设置调整,帮助用户改善设备的运行速度和整体性能。 ... [详细]
  • 本文深入探讨 PHPCMS 平台中的字符串截取函数 str_cut 的使用方法,该函数常用于控制输出的标题或内容摘要长度,有效避免因过长的文本导致的页面布局问题。通过本文,读者将掌握如何灵活运用此函数,包括处理 HTML 标签等高级技巧。 ... [详细]
  • 随着iTunes界面的更新,用户发现通过该平台安装IPA文件变得不再可能。面对这一变化,除了苹果官方推荐的TestFlight外,还有哪些高效便捷的方法呢?本文将为您详细介绍几种替代方案。 ... [详细]
  • JavaWeb技术架构解析
    本文探讨了JavaWeb开发中客户端与服务器端的交互模式,重点分析了B/S(浏览器/服务器)和C/S(客户端/服务器)两种架构的特点及应用场景。 ... [详细]
  • 本文介绍了如何使用JavaScript和jQuery实现页面元素随着滚动条的移动而相应变化位置的功能,提供了一段简洁的代码示例。 ... [详细]
  • BFS深搜hashtable来判断是横线还是竖线但是为啥还是90分啊呜呜!找不到原因#define_CRT_SECURE_NO_WARNINGS1#include ... [详细]
  • 在M1 Mac上使用Xcode编译iOS模拟器项目时,可能会遇到错误提示 'building for iOS Simulator, but linking in object file built for iOS, for architecture arm64',本文将提供解决方案。 ... [详细]
  • 在与客户的互动中,我们经常被问及BI系统是否提供了特定行业的解决方案。实际上,作为数据分析工具,BI系统的通用性远大于其行业针对性。本文将探讨BI系统的通用性和行业适应性。 ... [详细]
  • 无论是初学者还是经验丰富的开发者,W3CSchool都是一个不可或缺的资源库。本文将介绍几个关键的学习资源,帮助您提升网页开发技能。 ... [详细]
author-avatar
QJ974
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有