首页 > 系统相关 >Linux C++ 多线程编程

Linux C++ 多线程编程

时间:2024-08-11 12:48:56浏览次数:14  
标签:多线程 cout rosnoetic C++ mutex Linux unique VirtualBox

Linux C++ 多线程编程

参考教程:

c++:互斥锁/多线程的创建和unique_lock<mutex>的使用_mutex 头文件 vc++-CSDN博客

1. 编写unique_mutex

1.1 创建文件夹

通过终端创建一个名为unique_mutex的文件夹以保存我们的VSCode项目,在/unique_mutex目录下打开vscode

rosnoetic@rosnoetic-VirtualBox:~$ mkdir -p unique_mutex

rosnoetic@rosnoetic-VirtualBox:~$ cd unique_mutex/

rosnoetic@rosnoetic-VirtualBox:~/unique_mutex$ code .

1.2 编写源代码

新建文件unique_mutex.cpp

unique_mutex.cpp粘贴如下代码并保存(Ctrl+S)

// 添加iostream头文件,用于后续输出cout信息
#include <iostream>
// 添加线程thread头文件
#include <thread>
// 添加互斥锁mutex头文件
#include <mutex>
// 添加unistd头文件,用于为了使用后续的usleep函数进行暂停
#include <unistd.h>

// 声明互斥锁变量
std::mutex mymutex;

// 定义sayHello函数,用于循环打印hello
// 无需传参,也无需输出结果
void sayHello(){

    // 调用unique_lock对互斥锁mymutex变量进行独占
    std::unique_lock<std::mutex> lck(mymutex);
    // 循环打印结果
    for (int i = 0; i < 5; i++){
        // 暂停1毫秒
        usleep(1000);
        // cout输出结果
        std::cout << "Hello "<< std::endl;
    }

    // 函数执行完成后,自动释放互斥锁
}

// 定义sayWorld函数,用于循环打印World
// 无需传参,无需输出
void sayWorld(){
    
    // 调用unique_lock对互斥锁变量mymutex进行加锁,实现资源独占
    std::unique_lock<std::mutex> lck(mymutex);

    // 循环打印结果
    for (int i = 0;i < 5; i++){
        // 休息1毫秒
        usleep(1000);
        // 使用cout输出结果
        std::cout << "World " << std::endl;
    }

    // 循环结束后自动释放互斥锁资源

}

// 定义主函数入口
int main(int argc, char  argv){

    // 开辟线程,数据类型是thread,使用有参构造的方式,参数为函数指针
    std::thread ThreadHello(&sayHello);
    // 开辟线程,数据类型是thread,使用有参构造的方式,参数为函数指针
    std::thread ThreadWorld(&sayWorld);
    // 加入线程
    ThreadHello.join();
    ThreadWorld.join();

    return 0;
}

2. 新建CMakeLists.txt文件

新建CMakeLists.txt文件

CMakeLists.txt中添加如下内容:

# 声明要求的最低版本的cmake
cmake_minimum_required(VERSION 2.8)

# 为项目命名
project(UNIQUE_MUTEX)

# 添加可执行文件
add_executable(unique_mutex unique_mutex.cpp)

# 可执行文件链接到thread库
target_link_libraries(unique_mutex pthread)

3. 编译

ctrl+alt+T打开终端,执行如下指令进行cmake编译

rosnoetic@rosnoetic-VirtualBox:~$ cd unique_mutex/

rosnoetic@rosnoetic-VirtualBox:~/unique_mutex$ mkdir build

rosnoetic@rosnoetic-VirtualBox:~/unique_mutex$ cd build/

rosnoetic@rosnoetic-VirtualBox:~/unique_mutex/build$ cmake ..

接着make对工程进行编译

rosnoetic@rosnoetic-VirtualBox:~/unique_mutex/build$ make

进一步的调用可执行文件:

rosnoetic@rosnoetic-VirtualBox:~/unique_mutex/build$ ./unique_mutex 

可以看到加了锁之后,多线程执行时,由于sayHello已经占用了mymutex的资源,而sayWorld没有 获取到该资源,那么就会被阻塞,相当于还没有收到启动的指令,就会一直的等待、

标签:多线程,cout,rosnoetic,C++,mutex,Linux,unique,VirtualBox
From: https://www.cnblogs.com/windandchimes/p/18353261

相关文章

  • Python和多线程(multi-threading)
    在Python中,实现并行处理的方法有几种,但由于Python的全局解释器锁(GIL,GlobalInterpreterLock)的存在,传统意义上的多线程(使用threading模块)并不总能有效利用多核CPU来实现真正的并行计算。GIL确保任何时候只有一个线程在执行Python字节码。不过,仍然有几种方法可以绕过这个限制,......
  • C++入门基础知识9
    C++中的分号&语句块在C++中,分号是语句结束符。也就是说,每个语句必须以分号结束。它表明一个逻辑实体的结束。例如,下面是三个不同的语句: 语句块是一组使用大括号括起来的按逻辑连接的语句。例如: C++不以行末作为结束符的标识,因此,您可以在一行上放置多个语句......
  • Linux常用命令(图文并茂+超详细!)
    ......
  • Java - 多线程
    三种实现方式常用成员方法1.线程name默认“Thread-”+"序号"2.可以通过重写构造方法在创建时给线程命名线程的生命周期与状态同步代码块格式synchronized(锁对象){操作共享数据的代码}1.锁对象随机,但只要是有static修饰的唯一对象,一般写本类class文件,如MyTh......
  • C++ call_once详解
    引言在多线程编程中,常常需要确保某些初始化操作只执行一次,例如初始化一个全局资源或单例模式中的实例创建。C++11引入了std::call_once和std::once_flag,为这种需求提供了便捷和高效的解决方案。一、基本概念1.std::call_oncestd::call_once是一个函数模板,它确保某个函数在......
  • Linux5:Shell编程——函数、重定向
    目录前言一、函数1.函数结构2.函数实例3.函数传参二、重定向1.输出重定向2.输入重定向3.同时使用4.重定向深入了解 5.垃圾桶总结前言    Shell编程将会在本章完结 一、函数1.函数结构#!/bin/sh#函数functionfun1(){echo"thisisaf......
  • Linux源码下载渠道是什么
    Linux源码可以从多个渠道下载,以下是几个主要的下载途径:1.Linux官方网站官方网站地址:https://www.kernel.org/在Linux官方网站上,你可以找到最新版本的Linux内核源码包以及之前版本的源码包。网站主页通常会显示最新版本的Linux内核,点击该版本号即可进入下载页面。在下载页面上,......
  • linux系统CENTOS 7安装docker
    前言:使用阿里云镜像,在CENTOS7版本上安装docker容器,方便使用docker容器安装其他软件。前置准备如果已经安装了docker,先将其卸载。yumremovedocker安装docker安装docker依赖的软件包。sudoyuminstall-yyum-utilsdevice-mapper-persistent-datalvm2添加阿里......
  • C++11新特性
    C++11新特性语言特性移动语义右值引用转发引用可变模板列表初始化静态断言类型推导lambda表达式decltype类型声明nullptr空指针强类型枚举属性constexpr常量表达式委托构造用户定义语义显式虚重载Final限定符:限定的东西无法......
  • C++20新特性
    C++20新特性语言特性协程concept概念指定初始化器lambda表达式模板语义范围for循环增加初始化器[[likely]][unlikely]属性废弃隐式捕获this非类型模板参数的类类型constexpr虚函数explict(bool)立即函数usingenums,能直接进行using了lambda捕获参数包char8_t类型......