首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 多線程程式設計實戰:從 pthread 基礎到鎖機制與線程協作

     編輯:關於C++

環境與編譯

  • OS:Linux(Raspbian/Ubuntu/CentOS 等),Windows MinGW 亦可。
  • 頭文件:<pthread.h>
  • 編譯鏈接:g++ -o prog prog.cpp -lpthread(靜態鏈接可加 -static)。

基礎線程建立與退出

#include 
#include 
using namespace std;

void* thread_func(void* arg) {
    cout << "Thread running: " << (char*)arg << endl;
    return nullptr;
}

int main() {
    pthread_t t1, t2;
    pthread_create(&t1, nullptr, thread_func, (void*)"Thread-1");
    pthread_create(&t2, nullptr, thread_func, (void*)"Thread-2");
    pthread_exit(nullptr); // 等待所有線程結束
    return 0;
}

注意:線程啟動順序不確定,多次執行輸出順序可能不同。

類成員函式作為線程入口

必須宣告為 static,因為非靜態成員函式隱含 this 指標,簽名不匹配 void*(*)(void*)。
靜態成員函式屬於類而非物件,無 this,符合線程函式簽名。

class MyThread {
public:
    static void* run(void* arg) { ... }
};
pthread_create(&tid, nullptr, MyThread::run, nullptr);

參數傳遞

通過 void* arg 傳遞任意資料指標,線程內 static_cast 還原。生命週期管理至關重要:確保主線程不早於子線程銷毀參數物件。

線程同步與控制三大機制

1. 條件變量/標誌位輪詢(不推薦生產環境)

bool flag = true;
void* worker(void*) { while(flag) { /* busy wait */ } }
flag = false; // 主線程通知停止

缺點:忙等待浪費 CPU,無法精確控制順序。

2. pthread_join:等待特定線程結束

pthread_t t1, t2;
pthread_create(&t1, nullptr, func1, nullptr);
pthread_join(t1, nullptr); // 阻塞直到 t1 結束
pthread_create(&t2, nullptr, func2, nullptr); // t1 結束後才啟動 t2
pthread_join(t2, nullptr);

可獲取線程返回值(pthread_exit 傳遞的 void*)。

3. 互斥鎖:保護共享資料

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int shared = 0;

void* inc(void*) {
    pthread_mutex_lock(&mutex);
    ++shared;
    pthread_mutex_unlock(&mutex);
    return nullptr;
}

作用:確保同一時間僅一線程訪問臨界區。不保證執行順序,僅保證互斥存取。

進階主題:條件變量、讀寫鎖、線程池

生產級開發建議使用 C++11 <thread>、<mutex>、<condition_variable>、<future> 等標準庫設施,跨平台、型別安全、支援 RAII 鎖管理(lock_guard、unique_lock),避免手動 pthread 的易錯誤細節。

總結

  • 線程建立:pthread_create,靜態成員函式入口。
  • 參數傳遞:void*,注意生命週期。
  • 同步控制:pthread_join 等待結束,pthread_mutex 保護共享資料。
  • 現代 C++ 首選 std::thread 族群,更安全易用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved