390 votes

Exemple Simple de threads en C++

Quelqu'un peut-il poster un exemple simple de départ de deux (Orienté Objet) de threads en C++.

Je suis à la recherche effective C++ fil des objets que je peux prolonger exécuter des méthodes (ou quelque chose de similaire), par opposition à l'appel à un style C bibliothèque de threads.

Merci.

Mise à jour - j'ai laissé de côté tout OS des demandes spécifiques, dans l'espoir que celui qui a répondu permettrait de répondre à la croisée des bibliothèques plate-forme à utiliser. Je suis en train de l'explicite maintenant.

704voto

MasterMastic Points 3868

J'ai été surpris de voir toutes les réponses a choisi d'utiliser la 3ème parties au lieu de simplement en utilisant std::thread, donc je tiens à le signaler.

Créer une fonction que vous souhaitez que le thread à exécuter. Je vais vous montrer par un exemple trivial:

void task1(std::string msg)
{
    std::cout << "task1 says: " << msg;
}

Maintenant créer l' thread objet qui finira par appeler la fonction ci-dessus comme suit:

std::thread t1(task1, "Hello");

(Vous avez besoin d' #include <thread> pour accéder à la std::thread classe)

Comme vous pouvez le voir, le constructeur sont les arguments de la fonction, le thread va exécuter, suivie par la fonction de paramètres.

Enfin, le joindre à votre thread principal d'exécution comme suit:

t1.join(); 

Résultat

L'ensemble du code est ceci:

#include <string>
#include <iostream>
#include <thread>

using namespace std;

//The function we want to make the thread run.
void task1(string msg)
{
    cout << "task1 says: " << msg;
}

int main()
{
    // Constructs the new thread and runs it. Does not block execution.
    thread t1(task1, "Hello");

    //Makes the main thread wait for the new thread to finish execution, therefore blocks its own execution.
    t1.join();
}

Plus d'informations sur les std::thread ici

  • Sur GCC compiler avec -std=c++11.
  • Sur les versions de GCC 4.7 ci-dessous, utilisez -std=c++0x -pthread (au lieu de -std=c++0x).
  • Cela devrait fonctionner pour n'importe quel système d'exploitation, l'obtention de votre compilateur prend en charge ce (C++11).

85voto

Edward Kmett Points 18369

Eh bien, techniquement, un tel objet sera le vent se construit sur un C-style de fil de la bibliothèque parce que le C++ seulement spécifié un stock std::thread modèle dans c++0x, qui était tout simplement clouées et n'a pas encore été mis en œuvre. Le problème est quelque peu systémique, techniquement, le c++ existant modèle de mémoire n'est pas assez strict pour permettre ainsi une sémantique définie pour tous les " il se passe avant. Hans Boehm a écrit un papier sur le sujet un certain temps et a contribué à fixer les grandes lignes de c++0x standard sur le sujet.

http://www.hpl.hp.com/techreports/2004/HPL-2004-209.html

Cela dit, il ya plusieurs de la croix-plate-forme de thread en C++ bibliothèques qui fonctionnent très bien dans la pratique. Intel fil blocs de construction contient un tbb::thread objet qui se rapproche le c++0x standard et Boost a un boost::thread de la bibliothèque qui fait la même.

http://www.threadingbuildingblocks.org/

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

À l'aide de boost::thread, vous obtiendrez quelque chose comme:

#include <boost/thread.hpp>

void task1() { 
    // do stuff
}

void task2() { 
    // do stuff
}

int main (int argc, char ** argv) {
    using namespace boost; 
    thread thread_1 = thread(task1);
    thread thread_2 = thread(task2);

    // do other stuff
    thread_2.join();
    thread_1.join();
    return 0;
}

24voto

Warer Points 79

Il y a aussi une bibliothèque POSIX POSIX pour les systèmes d'exploitation. Vérifier pour assurer la compatibilité

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <iostream>

void *task(void *argument){
      char* msg;
      msg = (char*)argument;
      std::cout<<msg<<std::endl;
}

int main(){
    pthread_t thread1, thread2;
    int i1,i2;
    i1 = pthread_create( &thread1, NULL, task, (void*) "thread 1");
    i2 = pthread_create( &thread1, NULL, task, (void*) "thread 2");

    pthread_join(thread1,NULL);
    pthread_join(thread2,NULL);

    return 0;

}

compiler avec-lpthread

http://en.wikipedia.org/wiki/POSIX_Threads

9voto

Pukku Points 5571

Vous n'avez pas spécifié de votre plate-forme, mais dans la plupart des cas, je vous recommande de prendre un coup d'oeil à Boost.Fil, un exemple simple est disponible ici.

9voto

LorenzCK Points 2819

Il dépend en grande partie de la bibliothèque vous décidez d'utiliser. Par exemple, si vous utilisez la bibliothèque wxWidgets, la création d'un thread devrait ressembler à ceci:

class RThread : public wxThread {

public:
	RThread()
		: wxThread(wxTHREAD_JOINABLE){
	}
private:
	RThread(const RThread &copy);

public:
	void *Entry(void){
		//Do...

		return 0;
	}

};

wxThread *CreateThread() {
	//Create thread
	wxThread *_hThread = new RThread();

	//Start thread
	_hThread->Create();
	_hThread->Run();

	return _hThread;
}

Si votre principale thread appelle la CreateThread méthode, vous allez créer un nouveau thread qui va commencer à exécuter le code dans votre "Entrée" de la méthode. Vous devrez garder une référence vers le fil de discussion dans la plupart des cas, d'adhérer ou de l'arrêter. Plus d'infos ici: wxThread documentation

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X