Maison >développement back-end >C++ >Comment les pools de threads C 11 peuvent-ils améliorer la gestion des tâches et réduire les frais généraux ?

Comment les pools de threads C 11 peuvent-ils améliorer la gestion des tâches et réduire les frais généraux ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-22 21:35:10988parcourir

How Can C  11 Thread Pools Improve Task Management and Reduce Overhead?

Thread Pooling en C 11

Défi :
La création et la gestion de threads peuvent être coûteuses, surtout si répété pour chaque tâche. Comment pouvons-nous créer un pool de threads qui nous permet d'envoyer plusieurs tâches à un pool de threads, en évitant la surcharge de création de threads ?

Réponse :

Implémentation d'un thread pool en C 11 implique la création d’une classe qui gère une collection de threads pouvant être réutilisés pour exécuter des tâches. Voici un aperçu des aspects clés :

Implémentation de la classe ThreadPool :

La classe ThreadPool définit l'interface pour créer, gérer et arrêter un pool de threads.

1. ThreadPool::Start:
Initialise le pool de threads en créant le nombre spécifié de threads. Ces threads exécuteront une boucle infinie, en attente de tâches.

2. ThreadPool::ThreadLoop :
La boucle infinie que chaque thread du pool exécute. Il vérifie en permanence les nouvelles tâches, les exécute et se répète jusqu'à ce que la fin soit signalée.

3. ThreadPool::QueueJob:
Ajoute une tâche à la file d'attente du pool de threads. La tâche est un objet fonction qui définit le travail à effectuer.

4. ThreadPool::busy :
Vérifie si le pool de threads a des tâches en attente.

5. ThreadPool::Stop :
Termine le pool de threads, en attendant que tous les threads terminent leurs tâches en cours.

Intégration du ThreadPool :

Une fois le La classe ThreadPool est définie, vous pouvez l'utiliser comme suit :

thread_pool->QueueJob([] { /* ... */ });

Exemple :

std::vector<std::thread> workers;
int total = 4;
int arr[4] = {0};

void each_thread_does(int i) {
  arr[i] += 2;
}

int main() {
  // ThreadPool Example
  ThreadPool thread_pool;
  thread_pool.Start();

  for (int i = 0; i < 8; ++i) {
    for (int j = 0; j < 4; ++j) {
      thread_pool.QueueJob(std::bind(each_thread_does, j));
    }
  }

  // Wait for the thread pool to complete
  while (thread_pool.busy()) {}
  thread_pool.Stop();

  arr[4] = std::min_element(arr, arr + 4);
  return 0;
}

Cet exemple montre comment créer un pool de threads à l'aide de la classe fournie et soumettre plusieurs tâches au pool sans le besoin de création et de suppression de fils de discussion répétitifs.

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