2009-02-11 7 views
4

Je suis un programmeur java mais travaille actuellement sur le langage C++. Contrairement à java, le C++ ne définit aucun utilitaire de thread. C'est un peu difficile pour moi d'implémenter une application multithread en C++. Y at-il de toute façon quelqu'un peut implémenter sa propre bibliothèque de threading en utilisant C++? Dois-tu être capable de saisir un concept de langage d'assemblage? J'ai essayé à plusieurs reprises de créer un fil à partir des fonctionnalités spécifiques du système d'exploitation, mais j'ai toujours échoué. Quelqu'un peut-il aider?Implémentation d'une bibliothèque de threads C++ en C++

Répondre

8

Compte tenu de votre niveau d'expertise, peut-être que Boost Threads serait utile?

http://www.boost.org/doc/libs/1_37_0/doc/html/thread.html

En réponse à vos questions, bien sûr, vous pouvez mettre en œuvre votre propre bibliothèque de threads. Non, vous n'avez besoin de connaître aucun langage d'assemblage pour le faire, mais il n'y a pas de fonctions de bibliothèque standard C pour vous aider, vous devrez utiliser les bibliothèques spécifiques au système d'exploitation. Par exemple sur Windows, vous utilisez la fonction CRT beginthreadex, qui finit par appeler l'appel système CreateThread Win32, mais sur beaucoup d'unix vous utiliserez pthread_create.

Outre le démarrage d'un thread, vous avez probablement besoin de certaines primitives de synchronisation, la bibliothèque Boost delivers sur ce front également. Si vous voulez rouler le vôtre, sur Windows, regardez CreateMutex, WaitForSingleObject et ReleaseMutex ou les fonctions CriticalSection, sur unix, regardez pthread_mutex_init.

1

si vous utilisez des systèmes POSIX tels que Linux ou Unix or even windows vous pouvez utiliser pthread

si vous êtes coincé sur une machine Windows sans .NET je pense que vous n'avez pas d'autre choix que d'apprendre les discussions win32. Bien sûr, il y a beaucoup de "bibliothèques de threads Win32" sur les tubes.

Boost

CodeProject

SourceForge

Je soupçonne que la plupart des grands référentiels de code ont une sorte de mise en œuvre personnalisée ...

Les fenêtres remportent choix le plus facile pourrait être en cours pour .NET threads qui sont beaucoup plus faciles à traiter. You can have Visual C++ .NET for free

1

Les Pthreads peuvent être utilisés en C++. D'habitude, j'écris juste des enveloppes simples autour d'eux. En outre, si vous essayez simplement de diviser un tas de boucles de bas niveau, veuillez consulter OpenMP. C'est incroyablement facile à utiliser.

J'ai un petit projet C++ qui a une bibliothèque de threads ici. Le but est assez précis, mais peut servir d'exemple peut-être.

http://github.com/mikelikespie/reccage

6

Je suggère que vous utilisez une bibliothèque multi-plateforme existante Boost, ACE, POCO, QT ...

ACE a un peu de classes de fil, le plus simple à utiliser est probablement ACE_Task_Base . Vous en héritez et fournissez une implémentation pour la méthode int svc(). C'est la méthode qui est appelée lorsque vous activer le fil.

class WorkerThread : public ACE_Task_Base 
{ 
public: 
    int svc() { ... } 
}; 
int main() 
{ 
    WorkerThread worker; 
    worker.activate(); 
    worker.wait(); 
} 

Avec POCO, vous devez utiliser l'interface Runnable et l'utilisation est proche de ce que vous obtiendriez avec threads Java (si vous implémentez Runnable, pas étendre cette discussion):

class Worker : public Poco::Runnable { ... }; 
int main() 
{ 
    Worker worker; 
    Poco::Thread thr; 
    thr.start(worker); 
    thr.join(); 
} 

fils de Boost (recommandé) sont un peu différents. Au lieu d'implémenter/étendre une interface, cela dépend de l'opérateur() en cours de définition. Vous créez un thread en lui passant un objet qui implémente operator()(). Le thread commence en appelant cette méthode. La bonne nouvelle est qu'il est très simple de combiner avec boost :: bind pour créer un foncteur faux (opérateur la mise en œuvre de l'objet()):

class X { public: void method(int argument); } 
int main() 
{ 
    X x; 
    boost::thread thr(boost::bind(&X::method, &x, 100)); 
    thr.join(); 
} 

L'extrait va créer un objet de type X. Avec bind, vous créez un foncteur qui encapsule un appel à la méthode X :: méthode appliquée sur l'objet x, en lui passant 100 comme argument de la méthode.

Bien que cela diffère le plus de la perspective Java, c'est aussi l'approche la plus flexible, car vous pouvez découpler le modèle de thread du vrai code de travail. Pas besoin d'adapter une interface particulière. C'est aussi l'interface de threading standard à venir.

3

En plus des autres bibliothèques mentionnées, il y a le Threading Building Blocks d'Intel. C'est un open source (GPL2 avec exception de liaison), une bibliothèque multi-plateforme d'Intel.

+0

Il est agréable d'avoir au moins un court à la documentation, comme un grand nombre des idées sont citation utile. – Anonymous

Questions connexes