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沒有 獲取到該資源,那麼就會被阻塞,相當於還沒有收到啟動的指令,就會一直的等待、