《C++ Cookbook》是一本關于C++編程的實用教程,其中包含了許多關于多線程編程的示例和解釋
<thread>
頭文件。#include<iostream>
#include<thread>
std::thread
類創建一個新線程。將要執行的函數作為參數傳遞給std::thread
對象。void myFunction() {
// 在這里執行你的任務
}
int main() {
std::thread t(myFunction); // 創建一個新線程并執行myFunction
t.join(); // 等待線程完成
return 0;
}
std::thread
對象時傳遞這些參數。void myFunctionWithArgs(int a, int b) {
// 在這里執行你的任務
}
int main() {
std::thread t(myFunctionWithArgs, 10, 20); // 創建一個新線程并執行myFunctionWithArgs
t.join(); // 等待線程完成
return 0;
}
std::mutex
)來確保同一時間只有一個線程可以訪問資源。#include <mutex>
std::mutex mtx; // 全局互斥鎖
void threadFunction() {
mtx.lock(); // 加鎖
// 訪問共享資源
mtx.unlock(); // 解鎖
}
int main() {
std::thread t1(threadFunction);
std::thread t2(threadFunction);
t1.join();
t2.join();
return 0;
}
std::unique_lock
簡化互斥鎖的使用:std::unique_lock
可以自動管理互斥鎖的加鎖和解鎖操作,從而簡化代碼。#include <mutex>
std::mutex mtx; // 全局互斥鎖
void threadFunction() {
std::unique_lock<std::mutex> lock(mtx); // 自動加鎖
// 訪問共享資源
// 自動解鎖
}
int main() {
std::thread t1(threadFunction);
std::thread t2(threadFunction);
t1.join();
t2.join();
return 0;
}
std::condition_variable
)實現線程間的同步:條件變量允許一個或多個線程等待,直到另一個線程通知它們。#include<condition_variable>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void print_id() {
std::unique_lock<std::mutex> lck(mtx);
while (!ready) { // 如果ready為false,則等待
cv.wait(lck); // 當前線程被阻塞,等待條件變量被通知
}
// 打印線程ID
std::cout << "thread "<< std::this_thread::get_id() << '\n';
}
void go() {
std::unique_lock<std::mutex> lck(mtx);
ready = true; // 修改共享變量
cv.notify_all(); // 通知所有等待的線程
}
int main() {
std::thread threads[10];
for (auto& th : threads) {
th = std::thread(print_id);
}
std::cout << "10 threads ready to race...\n";
go(); // 啟動競爭
for (auto& th : threads) {
th.join();
}
return 0;
}
這些示例僅涵蓋了C++多線程編程的基本概念。在實際應用中,你可能還需要處理更復雜的場景,如線程池、原子操作、鎖無關編程等。建議你深入研究C++標準庫中的線程支持,以便更好地理解和應用多線程編程。