Maison  >  Article  >  développement back-end  >  Comment utiliser efficacement le multithreading en C++ ?

Comment utiliser efficacement le multithreading en C++ ?

WBOY
WBOYoriginal
2024-06-05 11:57:56736parcourir

L'utilisation du multithreading en C++ peut améliorer le parallélisme : Créer des threads : utilisez la classe std::thread ou la bibliothèque pthread pour créer des threads. Synchronisez les threads : utilisez des mécanismes de synchronisation tels que les mutex et les variables de condition pour garantir la sécurité des threads. Cas pratique : Par exemple, si plusieurs fichiers sont traités en parallèle, plusieurs threads sont créés pour traiter chaque fichier afin d'améliorer l'efficacité.

Comment utiliser efficacement le multithreading en C++ ?

Utiliser efficacement le multithreading en C++

La programmation multithread est cruciale dans le développement de logiciels car elle améliore le parallélisme et les performances des applications. Cet article présentera comment utiliser efficacement les fonctionnalités multi-threading en C++, y compris la création de threads, la synchronisation et des cas pratiques.

Création de threads

La création de threads en C++ peut être effectuée de deux manières :

  1. Classe std::thread : Introduite en C++11, elle fournit une manière moderne de créer et de gérer des threads. Utilisez le constructeur std::thread, en passant la fonction thread et tous les paramètres. std::thread 构造函数,传递线程函数和任意参数。
std::thread t(my_function, arg1, arg2);
  1. pthread 库:另一种选择是使用 POSIX 线程 (pthread) 库。包括 pthread.h 头文件并使用 pthread_create 函数创建线程。
pthread_t t;
pthread_create(&t, NULL, my_function, arg1);

线程同步

为了确保多个线程在访问共享数据时不会相互干扰,需要进行线程同步。C++ 提供了几种同步方法:

  1. 互斥量:std::mutex 类控制对共享数据的独占访问。只允许一个线程同时持有互斥锁。
std::mutex m;
{
    std::lock_guard<std::mutex> lock(m);
    // 对共享数据进行操作
}
  1. 条件变量:std::condition_variable
  2. std::condition_variable cv;
    std::mutex m;
    {
        std::unique_lock<std::mutex> lock(m);
        // 等待条件达成
        cv.wait(lock);
    }

      bibliothèque pthread : Une autre option consiste à utiliser la bibliothèque de threads POSIX (pthread). Incluez le fichier d'en-tête pthread.h et utilisez la fonction pthread_create pour créer le fil de discussion.

      #include <iostream>
      #include <fstream>
      #include <vector>
      #include <thread>
      
      using namespace std;
      
      void process_file(string filename, ofstream& out)
      {
          ifstream in(filename);
          string line;
          while (getline(in, line))
          {
              out << line << endl;
          }
      }
      
      int main()
      {
          // 文件名列表
          vector<string> filenames = {"file1.txt", "file2.txt", "file3.txt"};
      
          // 创建 output 输出文件
          ofstream out("output.txt");
      
          // 创建线程向量
          vector<thread> threads;
      
          // 为每个文件创建线程
          for (auto& filename : filenames)
          {
              threads.emplace_back(process_file, filename, ref(out));
          }
      
          // 等待线程完成
          for (auto& thread : threads)
          {
              thread.join();
          }
      
          cout << "Files processed successfully." << endl;
          return 0;
      }

      Synchronisation des threads

      🎜Pour garantir que plusieurs threads n'interfèrent pas les uns avec les autres lors de l'accès aux données partagées, la synchronisation des threads est requise. C++ propose plusieurs méthodes de synchronisation : 🎜🎜🎜🎜Mutex : La classe 🎜std::mutex contrôle l'accès exclusif aux données partagées. Un seul thread est autorisé à maintenir le verrou mutex en même temps. 🎜🎜rrreee
        🎜🎜Variable de condition : La classe 🎜std::condition_variable est utilisée pour informer les discussions des changements de conditions. Le thread peut attendre que la condition soit remplie avant de poursuivre l'exécution. 🎜🎜rrreee🎜🎜Cas pratique : traitement simultané de fichiers🎜🎜🎜Pour illustrer l'utilisation du multi-threading, considérons un programme qui traite plusieurs fichiers en parallèle. Le programme doit lire chaque ligne du fichier et l'écrire dans le fichier de sortie. 🎜rrreee🎜Dans cet exemple, nous créons plusieurs threads, chaque thread traite un fichier. Le thread principal crée un fichier de sortie et attend la fin de tous les threads. De cette façon, nous pouvons traiter plusieurs fichiers en parallèle, améliorant ainsi les performances. 🎜

    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