Linux C++ 多執行緒程式設計

守望者与托养者發表於2024-08-11

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

相關文章