C++ 並發程式設計涉及共享資源和同步操作,需要工程和設計模式來解決挑戰。工程模式包括多執行緒、行程、執行緒池、信號量和原子操作,用於有效管理執行緒。設計模式包括生產者-消費者隊列、讀者-寫者鎖、死鎖避免、預防飢餓和分治與征服,用於協調資料存取和處理。這些模式可應用於實際問題,如影像處理和日誌服務,以實現高效的並發程序。
C++ 並發程式設計中的工程與設計模式
引言
並發程式設計需要妥善處理共享資源和同步操作,以避免資料一致性問題。 C++ 為解決這些挑戰提供了各種工程和設計模式,本文將深入探討這些模式。
工程模式
實戰案例:
考慮使用執行緒池進行映像處理。圖像讀取和處理可以分配給池中的多個線程。
#include <vector> #include <future> #include <thread> void process_image(const std::string& filename) { // Image processing logic here } int main() { // 创建线程池 std::vector<std::thread> pool; int num_threads = 8; for (int i = 0; i < num_threads; ++i) { pool.push_back(std::thread([] { // 该线程将执行 image_processing() })); } // 提交任务到池 std::vector<std::future<void>> results; std::vector<std::string> filenames = {"image1.jpg", "image2.jpg", ...}; for (const auto& filename : filenames) { results.push_back(std::async(std::launch::async, process_image, filename)); } // 等待任务完成 for (auto& result : results) { result.wait(); } // 关闭线程池 for (auto& thread : pool) { thread.join(); } return 0; }
設計模式
實戰案例:
考慮使用生產者-消費者佇列實作一個日誌服務。生產者執行緒記錄事件,而消費者執行緒處理日誌並將其寫入檔案。
#include <queue> #include <mutex> #include <thread> std::queue<std::string> log_queue; std::mutex log_queue_mutex; void write_log(const std::string& entry) { std::lock_guard<std::mutex> lock(log_queue_mutex); log_queue.push(entry); } void process_logs() { while (true) { std::string entry; { std::lock_guard<std::mutex> lock(log_queue_mutex); if (log_queue.empty()) { // 队列为空时,防止忙等待 std::this_thread::sleep_for(std::chrono::milliseconds(1)); continue; } entry = log_queue.front(); log_queue.pop(); } // 处理日志项 } } int main() { // 创建生产者线程 std::thread producer(write_log, "Log entry 1"); // 创建消费者线程 std::thread consumer(process_logs); producer.join(); consumer.join(); return 0; }
結論
透過採用合適的工程和設計模式,C++ 程式設計師可以有效地實現並發程序,最大限度地提高效能和減少資料一致性問題。
以上是C++ 並發程式設計中的工程與設計模式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!