2010-09-15 4 views
2
std::thread f() 
{ 
    void some_function(); // <- here 
    return std::thread(some_function); 
} 

std::thread g() 
{ 
    void some_other_function(int); // <- here 
    std::thread t(some_other_function,42); 
    return t; 
} 
+0

Je pense qu'il peut y avoir eu un conflit d'édition ... désolé ... mais je ne vois pas la question de toute façon. Pourriez-vous au moins ajouter un commentaire au code sur ce que vous pensez être étrange ou manquant? – Potatoswatter

+0

Désolé pour mon mauvais anglais. – Liu

+0

@Liu: ne laissez pas votre pauvre anglais vous décourager d'essayer d'exprimer votre question. 1) La pratique rend parfait. 2) En ce moment, nous n'avons rien à répondre. – Potatoswatter

Répondre

4

lignes comme:

void some_function(); 

simplement déclarer une fonction qui sera définie ultérieurement. Les fonctions ne doivent pas nécessairement être déclarées en dehors de la portée de la fonction.

+0

Ce que je me demande vraiment, c'est que c'est dans une définition de fonction? – Liu

+1

@Liu: Non, c'est une * déclaration * - elle déclare simplement qu'il y a une fonction nommée 'some_function' qui retourne' void' et ne prend aucun paramètre. La définition est vraisemblablement quelque part plus tard dans le même fichier. –

+0

Merci, désolé pour mon mauvais C++! – Liu

1

C'est juste une déclaration de fonction, comme vous le pensiez. Il est courant (et recommandé) de placer les déclarations de fonction dans les fichiers d'en-tête, mais cela n'est en aucun cas nécessaire. Ils peuvent être dans des corps de fonction.

1

Définir une fonction renvoyant un objet thread:

std::thread f() 
{ 

Déclare une fonction extern sans argument retour void (généralement cela ne se fait dans la portée locale, mais il est valide):

void some_function(); 

Démarrer un thread exécutant cette fonction et lui renvoyer un handle:

return std::thread(some_function); 
} 

deal même que précédemment:

std::thread g() 
{ 
void some_other_function(int); 

Mais ce n'est pas valide. Vous ne pouvez pas faire une copie d'un thread, donc techniquement ce n'est pas OK pour créer un objet local thread puis le renvoyer. Je serais surpris si cela compilé, mais si c'est le cas, il pourrait casser lorsque vous construisez pour le débogueur.

std::thread t(some_other_function,42); 
return t; 
} 

Cela fonctionnerait, bien que:

return std::move(t); 
+0

Merci pour votre explication détaillée! – Liu

Questions connexes