在Linux下使用C++實現并發控制,通常會涉及到多線程編程。C++11標準庫提供了<thread>
頭文件,它包含了一些用于多線程編程的工具。此外,還有<mutex>
、<condition_variable>
、<future>
、<atomic>
等頭文件,它們提供了同步機制,如互斥鎖、條件變量、未來(用于異步操作)和原子操作。
以下是一個簡單的例子,展示了如何使用C++11的線程和互斥鎖來實現并發控制:
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx; // 創建一個互斥鎖
void print_block(int n, char c) {
mtx.lock(); // 加鎖
for (int i = 0; i < n; ++i) {
std::cout << c;
}
std::cout << '\n';
mtx.unlock(); // 解鎖
}
int main() {
std::thread th1(print_block, 50, '*');
std::thread th2(print_block, 50, '$');
th1.join(); // 等待線程th1結束
th2.join(); // 等待線程th2結束
return 0;
}
在這個例子中,我們定義了一個print_block
函數,它接受兩個參數:一個是要打印的字符數量n
,另一個是字符c
。在函數內部,我們使用mtx.lock()
來獲取互斥鎖,確保在同一時間只有一個線程可以執行打印操作。打印完成后,使用mtx.unlock()
釋放鎖。
在main
函數中,我們創建了兩個線程th1
和th2
,它們都調用print_block
函數,但是打印不同的字符。通過調用join
方法,我們確保主線程等待這兩個線程完成后再退出。
除了互斥鎖,C++還提供了其他同步機制,例如:
std::lock_guard
:一個方便的RAII(Resource Acquisition Is Initialization)風格的鎖管理類,它在構造時加鎖,在析構時自動解鎖。std::unique_lock
:一個比std::lock_guard
更靈活的鎖管理類,它允許延遲鎖定、時間鎖定、遞歸鎖定等。std::condition_variable
:用于線程間的等待/通知機制。std::atomic
:用于實現原子操作,保證操作的原子性,避免數據競爭。使用這些工具,你可以根據不同的場景選擇合適的并發控制策略。在實際應用中,還需要注意死鎖、活鎖等問題,并采取相應的預防措施。