9
votes

Comment interrompre un fil d'attente C ++ 0x?

Je envisage d'utiliser des threads C ++ 0X dans mon application au lieu de booster les fils. Cependant, je ne sais pas comment réimplémenter ce que j'ai avec des threads standard C ++ 0X, car ils ne semblent pas avoir une interruption interruption () .

Ma configuration actuelle est la suivante:

  • Un fil maître qui gère le travail;
  • plusieurs threads travailleurs qui effectuent les commandes de maîtrise.

    Les travailleurs appellent attendre () sur au moins deux variables de condition différentes. Master a un état "expiré": dans ce cas, il indique à tous les travailleurs de s'arrêter et de donner tout résultat qu'ils ont été obtenus à ce moment-là. Avec Boost Filets Master utilise juste Interrupt_all () sur un groupe de threads, ce qui cause des travailleurs à arrêter d'attendre. Au cas où ils n'attendent pas au moment présent, le maître définit également un indicateur bool que les travailleurs vérifient périodiquement.

    Cependant, dans c ++ 0x std :: thread Je ne vois aucun remplacement pour interruption () . Est-ce que ça me manque quelque chose? Sinon, comment puis-je mettre en œuvre le schéma ci-dessus afin que les travailleurs ne puissent pas dormir pour toujours?


0 commentaires

3 Réponses :


10
votes

Malheureusement, je ne vois pas d'une autre manière que de voter, au lieu d'utiliser une attente d'attente une attente chronométrée et une variable pour indiquer l'interruption a été effectuée.

void th(Interruptor& interruptor) {
  try {

    ...

    while (cnd1.timed_wait(d)==false) {
      interruptor.check_interruption_point();
    }
    ...
  } catch (interrupted_exception &) {}
}


1 commentaires

Je pense que je vais continuer à utiliser des fils de boost alors. Ils sont également buggy, mais au moins, j'ai une solution de contournement stable pour eux.



2
votes

Boost d'attente fait sur l'interruption () consiste à émettre une notify_all sur la condition qu'un thread est actuellement bloqué, puis vérifiez si une interruption a été demandée. Si une interruption a été demandée, il fait un coup de pouce :: thread_interrupted. Vous pouvez écrire un ton propre Classe basée sur STD :: Fil avec le mécanisme.


1 commentaires

Et écrivez probablement ma propre sous-classe de condition afin que le fil sache ce qu'il attend? Cela ressemble à un peu trop de travail pour moi.



2
votes

En effet, c ++ 11 std :: thread ne propose pas de mécanisme standard pour cela (encore?). Par conséquent, je la décision de la Directrice de la Directrice d'utiliser Boost :: Thread pour le moment.

Nous préférerions utiliser C ++ 11 STD :: Installations. Mais nous ne souhaitons pas ré-construire une installation de Boost () installations, compléter avec la variable de condition FUTZING pour interrompre les dormeurs, etc., sans raison. Créer une infrastructure comme celle-ci est amusant , et pas si difficile, mais non improductif et moins standard que d'utiliser Boost.

Cela aide à booster :: thread et std :: Le fil est tellement similaire que nous pensons que nous ne nous peignons pas dans un coin. (Nous nous attendons à une migration éventuelle sur STD :: Le fil d'être relativement facile, peut-être même trivial.)


0 commentaires