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