2016-08-05 1 views
2

J'ai reçu une ancienne base de code, où je veux utiliser certaines implémentations dans un nouvel environnement. L'ancienne base utilisait le cadre TBB que je ne connais pas vraiment.Équivalents TBB en C++ 11

sont en 11 C de tout équivalent il implementaions aux types de ces TBB:

  • TBB :: enumerable_thread_specific < ...>
  • mutex_t
  • mutex_t :: scoped_lock

Sinon: Des conseils sur la façon de les convertir (liens vers de bons résumés TBB, des tutoriels, ...) ou dois-je travailler moi-même dans toute la documentation TBB?

(Et pas au TBB Insérer projet n'est pas une option..)

EDIT: oublier de mentionner TBB :: this_tbb_thread :: donner toute suggestion à ce sujet?

+0

Je suggère que l'ancienne base de code fonctionne d'abord et ensuite seulement change. –

Répondre

2

Les fonctionnalités TBB dans votre code ont des équivalents en C++ 11 (ou vous pouvez en créer un simplement).

  1. enumerable_thread_specific<T> est une implémentation de stockage local. Il peut utiliser le stockage local de la plateforme ou un tbb::concurrent_vector pour stocker des instances. La valeur par défaut est de ne pas utiliser de clés de stockage local de thread de plate-forme. C++ 11 a le qualificateur thread_local, donc en fonction de la façon dont le enumerable_thread_specific est utilisé, vous pouvez le remplacer par une version thread_local du même type. Si vous utilisez la structure pour conserver les données, ou pour y accéder en dehors d'un contexte local, vous pouvez avoir votre travail découpé pour vous.
  2. mutex_t est un type mutex générique, et peut être remplacé par std::mutex, bien que le développeur puisse avoir chosen a particular implementation (comme spin_mutex) qui sera affecté par le remplacement.
  3. scoped_lock est un objet qui verrouille le mutex lors de la construction, et lorsque la sortie de la portée déverrouille le mutex (ce qui le rend un peu plus convivial). Vous pouvez utiliser std::lock_guard<std::mutex> si vous êtes au C++ 17, sinon vous peut rouler le vôtre.
  4. Cela fait un moment que je lis la documentation sur le rendement. Je crois que la mise en œuvre cherche d'autres tâches possibles avant d'abandonner la tranche de temps. Vous pouvez utiliser std::this_thread::yield() pour relancer la tranche de temps, mais le comportement peut différer si le code utilise des constructions TBB. Le fait que vous n'ayez pas mentionné d'autres choses TBB implique pour moi qu'il n'y en a aucun dans le programme, et le tbb::yield() fait la même chose que std::this_thread::yield().
+0

Merci pour la bonne réponse. Malheureusement, ils ont utilisé spin_mutex et cela affecte le code car une taille de page spécifique est maintenant dépassée. Connaissez-vous un remplacement pour spin_mutex? – Herget

+0

La famille des mutex a tous la même propriété de base (exclusion mutuelle). La différence est la performance; spin_mutex est fastet, injuste et monopolise le CPU. Je ne sais pas pourquoi cela causerait un problème avec la taille de la page, sauf s'il s'agit d'un membre d'une classe. Les mutex sont alignés sur la mémoire afin d'avoir les meilleures performances (un mutex de 4 octets aligné sur une limite de 2 octets nécessiterait beaucoup de «finagling» pour que cela fonctionne.) Le mutex fait-il partie d'une classe? Si oui, regardez les compensations de classe; peut-être vous pouvez mélanger les membres pour minimiser l'espace d'alignement requis. – cahuson

2

Je suggérerais de faire en sorte que l'ancienne base de code fonctionne d'abord et ensuite seulement de la changer.

tbb::enumerable_thread_specific<...> n'a pas d'équivalent standard. Vous pouvez remplacer par std::mutex et std::unique_lock<std::mutex>.

+0

Merci. L'ancienne base de code fonctionne sur l'ancien système. Des suggestions sur la façon de traduire le type de thread? (: – Herget

+0

btw: oublié de mentionner tbb :: this_tbb_thread :: yield.indd Vous avez des suggestions à propos de celui-ci? – Herget

+2

Indice @Herget: la bibliothèque standard préfixe les choses avec 'std' et il y a un endroit appelé google où vous pouvez taper des choses comme' std :: yield' et il vous dira si une telle chose existe. – kfsone