一、C++11線程庫簡介
C++11線程庫是C++11標準中新增的庫,它提供了創建和控制執行線程的功能,這使得在C++中編寫多線程程序更加方便和容易。C++11線程庫包含了一些重要的類:
- std::thread:用於創建線程。
- std::mutex:用於保護共享數據的互斥鎖。
- std::condition_variable:用於線程間的通信,實現等待和通知機制。
使用這些類可以實現多個線程的同步和協作。
二、使用std::thread創建線程
使用std::thread創建線程的步驟如下:
- 定義一個函數,這個函數將作為子線程的入口點。
- 創建std::thread對象,指定子線程的入口點函數。
- 在主線程中調用std::thread的join()函數等待子線程執行完畢。
#include #include // 子線程入口點函數 void thread_func() { std::cout << "子線程開始執行" << std::endl; // TODO: 子線程具體執行的任務 std::cout << "子線程執行完畢" << std::endl; } int main() { std::cout << "主線程開始執行" << std::endl; std::thread t(thread_func); // 創建子線程,指定入口點函數 t.join(); // 等待子線程執行完畢 std::cout << "主線程執行完畢" << std::endl; return 0; }
三、使用std::mutex實現互斥鎖
當多個線程訪問共享數據時,需要確保每個線程在訪問共享數據時不會相互干擾,防止數據不一致的情況發生。這時就需要使用互斥鎖來防止多個線程同時訪問共享數據。
使用std::mutex實現互斥鎖的步驟如下:
- 定義std::mutex對象。
- 使用std::lock_guard保護共享數據。
- 確保每個線程都使用std::lock_guard來保護共享數據。
#include #include #include std::mutex g_mutex; // 子線程入口點函數 void thread_func() { std::cout << "子線程開始執行" << std::endl; // 使用std::lock_guard保護共享數據 std::lock_guard guard(g_mutex); // TODO: 子線程訪問共享數據 std::cout << "子線程執行完畢" << std::endl; } int main() { std::cout << "主線程開始執行" << std::endl; // 使用std::lock_guard保護共享數據 std::lock_guard guard(g_mutex); std::thread t(thread_func); // 創建子線程,指定入口點函數 t.join(); // 等待子線程執行完畢 std::cout << "主線程執行完畢" << std::endl; return 0; }
四、使用std::condition_variable實現線程間通信
在多線程程序中,有時需要線程間進行通信,以實現協作。std::condition_variable可以用於實現線程間的等待和通知機制。
使用std::condition_variable的步驟如下:
- 定義一個std::condition_variable對象。
- 在等待條件成立時,調用std::condition_variable的wait()函數進入等待狀態。
- 在條件成立時,調用std::condition_variable的notify_one()或notify_all()函數通知等待的線程。
#include #include #include #include std::mutex g_mutex; std::condition_variable g_cv; bool g_flag = false; // 子線程入口點函數 void thread_func() { std::cout << "子線程開始執行" << std::endl; std::unique_lock lock(g_mutex); // 等待條件成立 while (!g_flag) { std::cout << "等待條件成立" << std::endl; g_cv.wait(lock); // 進入等待狀態 } // TODO: 子線程具體執行的任務 std::cout << "子線程執行完畢" << std::endl; } int main() { std::cout << "主線程開始執行" << std::endl; std::thread t(thread_func); // 創建子線程,指定入口點函數 std::this_thread::sleep_for(std::chrono::seconds(3)); // 暫停3秒鐘 // 在條件成立時,通知等待的線程 { std::lock_guard guard(g_mutex); g_flag = true; std::cout << "條件成立,通知等待的線程" << std::endl; } g_cv.notify_one(); t.join(); // 等待子線程執行完畢 std::cout << "主線程執行完畢" << std::endl; return 0; }
五、總結
本文介紹了使用C++11線程庫編寫高效多線程程序的一些方法,包括使用std::thread創建線程,使用std::mutex實現互斥鎖,使用std::condition_variable實現線程間通信等。
在進行多線程編程時,需要注意線程間的同步和協作,保證程序的正確性和高效性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/306498.html