Maison  >  Article  >  développement back-end  >  Modèles d’ingénierie et de conception en programmation simultanée C++ ?

Modèles d’ingénierie et de conception en programmation simultanée C++ ?

王林
王林original
2024-06-04 17:00:00586parcourir

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.

C++ 并发编程中的工程和设计模式?

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

  • Multi-threading : Effectuez plusieurs tâches simultanément pour améliorer les performances.
  • Processus : Environnement d'exécution isolé qui partage les ressources du système d'exploitation avec d'autres processus.
  • Thread Pool : Une collection de threads pré-alloués pour réduire les frais de création de threads.
  • Semaphore : Mécanisme de synchronisation pour limiter l'accès simultané aux ressources partagées.
  • Opérations atomiques : Effectuez des opérations atomiques sur un seul emplacement mémoire dans un environnement à thread unique.

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

  • File d'attente producteur-consommateur : Abstraction de file d'attente qui permet aux producteurs d'écrire des données dans la file d'attente et aux consommateurs de lire les données de la file d'attente.
  • Reader-Writer Lock : Mécanisme de synchronisation qui limite l'accès simultané en lecture et en écriture aux données partagées.
  • Évitement des impasses : Prévenez les blocages grâce à une acquisition minutieuse des ressources et à un ordre de libération.
  • Prévenir la famine : Assurez-vous que chaque fil a une chance d'obtenir des ressources et évitez que certains fils soient affamés pendant une longue période.
  • Diviser et conquérir : Diviser le problème en sous-tâches concurrentes plus petites, puis fusionner les résultats.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn