首页 > 编程语言 >(C++) atomic_flag的使用

(C++) atomic_flag的使用

时间:2022-11-22 17:45:40浏览次数:30  
标签:working 139922255111744 139922263504448 C++ flag atomic 139922246719040 tid id

使用示例

#include <atomic>
#include <iostream>
#include <thread>
#include <vector>

int main(int argc, char** argv) {
  constexpr size_t kLoopNum = 10;
  std::atomic_flag lock = ATOMIC_FLAG_INIT;
  auto thd_func = [kLoopNum, &lock]() {
    while (lock.test_and_set(std::memory_order_acquire)) { // 自旋锁
      ;
    }

    const auto tid = std::this_thread::get_id();
    for (size_t i = 0; i < kLoopNum; i++) {
      std::cout << "tid " << tid << " working id " << i << std::endl;
    }

    std::cout << "thread exit " << tid << std::endl;
    lock.clear(std::memory_order_release);
  };

  std::vector<std::thread> thds(3);
  for (auto& thd : thds) {
    thd = std::thread(thd_func);
  }

  for (auto& thd : thds) {
    thd.join();
  }

  return 0;
}

输出

tid 139922263504448 working id 0
tid 139922263504448 working id 1
tid 139922263504448 working id 2
tid 139922263504448 working id 3
tid 139922263504448 working id 4
tid 139922263504448 working id 5
tid 139922263504448 working id 6
tid 139922263504448 working id 7
tid 139922263504448 working id 8
tid 139922263504448 working id 9
thread exit 139922263504448
tid 139922255111744 working id 0
tid 139922255111744 working id 1
tid 139922255111744 working id 2
tid 139922255111744 working id 3
tid 139922255111744 working id 4
tid 139922255111744 working id 5
tid 139922255111744 working id 6
tid 139922255111744 working id 7
tid 139922255111744 working id 8
tid 139922255111744 working id 9
thread exit 139922255111744
tid 139922246719040 working id 0
tid 139922246719040 working id 1
tid 139922246719040 working id 2
tid 139922246719040 working id 3
tid 139922246719040 working id 4
tid 139922246719040 working id 5
tid 139922246719040 working id 6
tid 139922246719040 working id 7
tid 139922246719040 working id 8
tid 139922246719040 working id 9
thread exit 139922246719040
``

## 说明
1. atomic_flag使用自旋锁,即忙等。好处是处在用户空间不用陷入kernel。
2. 猜测针对ARM应该有性能上的影响,因为忙等轮询期间每次查询需要使用acquire/release,seq_cst等内存模型,导致data cache清空。
3. 经过简单测试,内存fence指令对ARM影响很大,但是针对原本就是强内存序的x86影响不大。

标签:working,139922255111744,139922263504448,C++,flag,atomic,139922246719040,tid,id
From: https://www.cnblogs.com/vaughnhuang/p/16915899.html

相关文章

  • C++初阶(stack+queue)
    stackstack介绍stack是一种先进后出的数据结构,只有一个出口,类似于栈。stack容器哦允许新增元素,移除元素,取得栈顶元素,但是除了最顶端之后,没有任何其他办法可以存取stack的......
  • ROS_C++_第三方库Eigen
    Eigen提供了快速的矩阵线性代数运算,矩阵、向量、旋转矩阵、变换矩阵。Eigen是纯头文件搭建成的库,使用时只需引入Eigen的头文件即可,不需要链接库文件target_link安装......
  • c++ bitse用法
    c++bitse用法bitset类似于数组结构,但是它的每一个元素之能是0或1,每个元素仅用1bit空间。应用是须加入​​​#include<bitset>​​0.引子Determineifallcharactersof......
  • C++11创建线程的三种方式
    1.通过函数thread:标准库的类join:阻塞主线程并等待//MultiThread.cpp:Definestheentrypointfortheconsoleapplication.#include"stdafx.h"#include<iostream>#i......
  • C++异常处理
    语法应用boolfun(){inta=7,b=0;//if(b==0)throw"error!";if(b==0)throw404.1;intc=a/b;}intmain(intargc,constchar**argv){try{......
  • C/C++预处理命令
    防止重复包含头文件#ifndef__文件名大写_H__#define__文件名大写_H__#endif//__文件名大写_H__//c++pragmaonce较老编译器不支持,以上两种方法都行。......
  • Vscode/Sublime C++ 打印中文乱码问题解决
    #include<iostream>usingnamespacestd;#ifdef_WIN32#include<windows.h>#endifintmain(){#ifdef_WIN32//控制台显示乱码纠正SetConsoleOutp......
  • 用C++写一遍linux socket通信过程
    要想深刻理解一些技术的底层,我还是觉得非用用c/c++写一遍的比较好。这其中的原因相信懂的人都懂。回忆一下上学时候在c语言课堂上的激动劲,如今感觉对c的理解真的都是那时候......
  • C++11
    longlong超长整形 C++11longlong超长整形详解(biancheng.net)    待更。。。......
  • 【C++/STL】0.容器概述
    文章目录​​一、容器分类​​​​(1)序列性容器​​​​(2)关联式容器​​​​(3)容器适配器​​​​二、容器共性​​​​三、容器比较​​一、容器分类(1)序列性容器​​序列式容......