Maison  >  Article  >  développement back-end  >  Comment utiliser les coroutines pour implémenter la programmation concurrente en C++ ?

Comment utiliser les coroutines pour implémenter la programmation concurrente en C++ ?

PHPz
PHPzoriginal
2024-06-04 21:33:01924parcourir

Comment utiliser les coroutines pour implémenter la programmation concurrente en C++ ?

Comment utiliser les coroutines pour implémenter la programmation simultanée en C++

Les coroutines sont des primitives de concurrence légères qui permettent aux programmeurs d'effectuer des tâches parallèles sans créer de threads séparés. Ceci est utile pour les applications très gourmandes en E/S, car les coroutines consomment beaucoup moins de temps système que les threads lors du changement de tâche.

Coroutines en C++

Les coroutines ont été introduites dans C++ 20 en tant que framework std::coroutine. Coroutine est une fonction génératrice qui peut suspendre l'exécution et renvoyer une valeur via une expression co_yield. Contrairement aux générateurs classiques, les coroutines peuvent suspendre et reprendre l'exécution plusieurs fois.

// 一个协程示例
std::coroutine<int> my_coroutine() {
  int value = 0;
  while (true) {
    value++;
    co_yield value;  // 挂起执行并返回 value
  }
}

Exemples pratiques de coroutines

Les coroutines sont très utiles dans les scénarios suivants :

  • Opérations d'E/S non bloquantes : Les coroutines peuvent être utilisées pour implémenter des opérations d'E/S non bloquantes, telles que le réseau. requêtes ou fichiers Lire.
  • Pipes et filtres : Les coroutines peuvent être utilisées pour créer des pipelines et des filtres pour traiter et transformer les flux de données.
  • Coordonner les tâches simultanées : Les coroutines peuvent être utilisées pour coordonner plusieurs tâches simultanées, telles que le traitement de données parallèle ou l'informatique distribuée.

Exemple : Utilisation de coroutines pour des E/S non bloquantes

L'exemple suivant montre comment utiliser des coroutines pour des requêtes réseau non bloquantes :

#include <iostream>
#include <future>

// 一个协程来发送 HTTP 请求
std::coroutine<std::string> get_url(const std::string& url) {
  // 创建一个 HTTP 客户端
  auto client = std::make_unique<cpprestsdk::http_client>(url);
  
  // 向服务器发送 GET 请求
  auto response = co_await client->request(cpprestsdk::methods::GET);
  
  // 返回响应体
  co_return response.extract_string().get();
}

int main() {
  // 并发发送两个 HTTP 请求
  auto f1 = std::async(std::launch::async, get_url("https://example.com/1"));
  auto f2 = std::async(std::launch::async, get_url("https://example.com/2"));
  
  // 获取请求结果
  std::cout << f1.get() << std::endl;
  std::cout << f2.get() << std::endl;
}

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