Pourquoi le destructeur d'un futur est-il renvoyé par le blocage std::async ?
En C 11, le destructeur d'un futur est renvoyé par std::async bloque, conduisant à des blocages potentiels. Ce comportement a suscité des inquiétudes, déclenchant une série de propositions et de discussions au sein du comité de normalisation.
Le nœud du problème réside dans la garantie de la sécurité des threads. Sans le comportement de blocage, une situation pourrait survenir dans laquelle un thread associé continue de s'exécuter après la destruction du futur, ne laissant aucun moyen de synchroniser son achèvement. Cela pourrait entraîner une corruption de la mémoire ou même compromettre la sécurité du système.
Comme l'explique Hans Boehm dans N3679, ce scénario est exacerbé par des exceptions non gérées qui peuvent contourner le code destiné à attendre son achèvement. Par conséquent, le destructeur bloquant agit comme un filet de sécurité, empêchant de tels résultats catastrophiques.
Malgré de longues délibérations, la communauté C n'est pas parvenue à un consensus sur cette question. Depuis C 14, les destructeurs de std::future et std::thread restent bloquants.
Cependant, la situation pourrait évoluer dans le futur. Le Trip Report de Michael Wong de 2013 indique que même si la motion visant à déprécier std::async a échoué, il existe une reconnaissance croissante du danger potentiel posé par son comportement de blocage.
En attendant, les programmeurs devraient en être conscients. émettez et utilisez des mesures appropriées, telles que des gardes de portée ou des mécanismes de synchronisation explicites, pour garantir la sécurité des threads lorsque vous travaillez avec des contrats à terme renvoyés par std::async.
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!