Linux C++ 多线程编程

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没有 获取到该资源,那么就会被阻塞,相当于还没有收到启动的指令,就会一直的等待、

posted on   守望者与托养者  阅读(28)  评论(0编辑  收藏  举报
努力加载评论中...

点击右上角即可分享
微信分享提示