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