蓝桥ros机器人之现代c++学习笔记7.2互斥量与临界区(代码片段)

zhangrelay zhangrelay     2022-12-03     624

关键词:

看如下三段代码:

// mutex example
#include <iostream>       // std::cout
#include <thread>         // std::thread
#include <mutex>          // std::mutex

std::mutex mtx;           // mutex for critical section

void print_block (int n, char c) 
  // critical section (exclusive access to std::cout signaled by locking mtx):
  mtx.lock();
  for (int i=0; i<n; ++i)  std::cout << c; 
  std::cout << '\\n';
  mtx.unlock();


int main ()

  std::thread th1 (print_block,50,'*');
  std::thread th2 (print_block,50,'$');

  th1.join();
  th2.join();

  return 0;

#include <iostream>
#include <mutex>
#include <thread>

int v = 1;

void critical_section(int change_v) 
    static std::mutex mtx;
    std::lock_guard<std::mutex> lock(mtx);

    // do contention operations
    v = change_v;

    // mtx will be destructed when exit this region


int main() 
    std::thread t1(critical_section, 2), t2(critical_section, 3);
    t1.join();
    t2.join();

    std::cout << v << std::endl;
    return 0;

#include <iostream>
#include <mutex>
#include <thread>

int v = 1;

void critical_section(int change_v) 
    static std::mutex mtx;
    std::unique_lock<std::mutex> lock(mtx);
    // do contention operations
    v = change_v;
    std::cout << v << std::endl;
    // release the lock
    lock.unlock();

    // during this period,
    // others are allowed to acquire v

    // start another group of contention operations
    // lock again
    lock.lock();
    v += 1;
    std::cout << v << std::endl;


int main() 
    std::thread t1(critical_section, 2), t2(critical_section, 3);
    t1.join();
    t2.join();
    return 0;

尝试编译无果……

查一下,c++20应该可以。

 

只能使用如下链接:

coliru.stacked-crooked.com


01

 

02

 

 

03 


 

蓝桥ros机器人之现代c++学习笔记2.4控制流(代码片段)

ifconstexpr#include<iostream>template<typenameT>autoprint_type_info(constT&t)ifconstexpr(std::is_integral<T>::value)returnt+1;elsereturnt+0.001;//atcompilingtime//intprin 查看详情

蓝桥ros机器人之现代c++学习笔记7.4条件变量(代码片段)

学习如下代码://condition_variableexample#include<iostream>//std::cout#include<thread>//std::thread#include<mutex>//std::mutex,std::unique_lock#include<condition_variable>//std 查看详情

蓝桥ros机器人之现代c++学习笔记2.3类型推导(代码片段)

auto#include<initializer_list>#include<vector>#include<iostream>classMagicFoopublic:std::vector<int>vec;MagicFoo(std::initializer_list<int>list)for(autoit=list.begin( 查看详情

蓝桥ros机器人之现代c++学习笔记3.3右值引用(代码片段)

右值引用和左值引用#include<iostream>#include<string>voidreference(std::string&str)std::cout<<"lvalue"<<std::endl;voidreference(std::string&&str)std::cout<<" 查看详情

蓝桥ros机器人之现代c++学习笔记4.1线性容器(代码片段)

学习的程序如下:#include<iostream>#include<array>#include<vector>voidfoo(int*p,intlen)for(inti=0;i!=len;++i)std::cout<<p[i]<<std::endl;intmain()std::vector<int>v;std::cout<<"size:"<<v.size()<<std::endl;//outpu... 查看详情

蓝桥ros机器人之现代c++学习笔记资料(代码片段)

在蓝桥云课ROS中,使用:gitclonehttps://github.com/changkun/modern-cpp-tutorial.git案例作者使用系统如下: 云实践平台使用-std=c++17,书中第一章案例:需要做一些修改的。否则报错如下:C=gccCXX=clang... 查看详情

蓝桥ros机器人之现代c++学习笔记2.1常量(代码片段)

 nullptrC++11引入了nullptr关键字,专门用来区分空指针、0。#include<iostream>#include<type_traits>voidfoo(char*);voidfoo(int);intmain()if(std::is_same<decltype(NULL),decltype(0)>::value)std::cout<<"NULL==0"<<std::endl;if(std... 查看详情

蓝桥ros机器人之现代c++学习笔记7.5原子操作(代码片段)

学习如下代码:线程竞争和乱序执行#include<thread>#include<iostream>intmain()inta=0;volatileintflag=0;std::threadt1([&]()while(flag!=1);intb=a;std::cout<<"b="<<b<<std::endl;);std::threadt2([&]()a=5;flag=1;);... 查看详情

蓝桥ros机器人之现代c++学习笔记7.5内存模型(代码片段)

学习代码如下:#include<atomic>#include<thread>#include<vector>#include<iostream>usingnamespacestd;usingnamespacestd::chrono;constintN=10000;voidrelaxed_order()cout<<"relaxed_order:"<<endl;atomic<int>counter=0;vector<thread>v... 查看详情

步履艰难的课程维护→机器人工程←蓝桥ros1/2云课(代码片段)

...水的朋友还是非常多的。蓝桥ROS课程已经开设5年了:机器人课程反馈中如何面对批评和负面消息_zhangrelay的博客-CSDN博客 最大的问题出现在哪里呢?和教育机器人市场类似。很多人围绕一些点,做类似同质化的机器... 查看详情

ros学习笔记之——3dmapmerge(代码片段)

之前博客《ROS实验笔记之——基于cartographer的多机器人SLAM地图融合》已经实现了2Dmapmerge,也做了大量这方面的demotwo基于两个turtlebot2的多机器人SLAM地图融合本博文看看3dmapmerge方面的资料首先呢有CCM-SLAM(https://github.com/VI... 查看详情

蓝桥ros机器人之c++基础1总结和测评(代码片段)

蓝桥ROS机器人之C++基础开发第一个程序语句是一种使程序执行某些操作的指令。语句通常以分号结束。函数是按顺序执行的语句的集合。每个C++程序都必须包含一个名为main的特殊函数。当运行程序时,执行从main... 查看详情

ros学习笔记之——evo工具的使用(代码片段)

之前博客《ROS学习笔记之——VICON的使用》用vincon获得了机器人的真实轨迹,并且通过amcl可以获得了机器人的定位结果,下面通过EVO包来表征performance(本文不像网上大部分博客复制粘贴别人的图,连跑都没跑过&#... 查看详情

蓝桥ros机器人之ros1和ros2切换(代码片段)

首先,确保完成配置:☞ 蓝桥ROS机器人系统更新和功能包安装记录为了确保安装速度,请使用国内源:sudosh-c'./etc/lsb-release&&echo"debhttp://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/`lsb_release-cs`m 查看详情

ros仿真笔记之——基于rrt_exploration的单个机器人自主探索建图(代码片段)

之前博文已经介绍过机器人exploration以及多机器人SLAMmapmerage《ROS学习笔记之——多机器人探索环境》《ROS仿真笔记之——基于gazebo的多机器人探索环境仿真》《ROS仿真笔记之——多移动机器人SLAM地图融合》《ROS仿真笔记之——... 查看详情

蓝桥ros机器人之c++基础2总结和测评(代码片段)

函数是旨在完成特定工作的可重用语句序列。自己编写的函数称为用户定义函数。函数调用是告诉CPU执行函数的表达式。发起函数调用的函数是调用者,被调用的函数是被调用者或被调用函数。进行函数调用时不要忘记包含... 查看详情

ros学习笔记之——gazebo仿真(代码片段)

...人学习gazebo的学习记录。 Gazebo是一款3D仿真器,支持机器人开发所需的机器人、传感器和环境模型,并且通过搭载的物理引擎可以得到逼真的仿真结果。Gazebo是近年来最受欢迎的三维仿真器之一,并被选为美国DARPA机... 查看详情

云原生与蓝桥ros机器人课程2017-2022

☞蓝桥云课ROS机器人发布5年啦(原实验楼ROS机器人在线云实践课程)☞蓝桥ROS机器人之曾经新版本(indigo/kinetic/melodic/ardent/dashing)通过查阅资料发现云原生通常有如下五个特征:轻、快、不变的基础设施弹性... 查看详情