Maison >développement back-end >C++ >Modèles d'ingénierie et de conception en programmation simultanée C++ ?
La programmation simultanée en C++ implique des ressources partagées et des opérations synchronisées, nécessitant des modèles d'ingénierie et de conception pour résoudre les défis. Les modes d'ingénierie incluent le multithreading, les processus, les pools de threads, les sémaphores et les opérations atomiques pour une gestion efficace des threads. Les modèles de conception incluent les files d'attente producteur-consommateur, les verrous lecteur-écrivain, l'évitement des blocages, la prévention de la famine et la division pour régner pour coordonner l'accès et le traitement des données. Ces modèles peuvent être appliqués à des problèmes du monde réel tels que les services de traitement d'images et de journalisation pour mettre en œuvre des programmes simultanés efficaces.
Modèles d'ingénierie et de conception dans la programmation simultanée C++
Introduction
La programmation simultanée nécessite une gestion appropriée des ressources partagées et des opérations de synchronisation pour éviter les problèmes de cohérence des données. C++ propose divers modèles d’ingénierie et de conception pour résoudre ces défis, que cet article explorera en profondeur.
Mode Projet
Cas pratique :
Pensez à utiliser un pool de threads pour le traitement des images. La lecture et le traitement des images peuvent être répartis entre plusieurs threads du pool.
#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; }
Design Pattern
Cas pratique :
Envisagez d'utiliser une file d'attente producteur-consommateur pour implémenter un service de journalisation. Le thread producteur enregistre les événements, tandis que le thread consommateur traite le journal et l'écrit dans un fichier.
#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; }
Conclusion
En adoptant des modèles d'ingénierie et de conception appropriés, les programmeurs C++ peuvent implémenter efficacement des programmes simultanés, maximiser les performances et réduire les problèmes de cohérence des données.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!