2012-07-31 2 views
-1

j'ai un problème, j'ai ce pointeurs dans mon code de fil et ils sont modifier là-dedans, mais quand il revenir au menu principal les changements ne sont pas là comme ceci:nœud pointé par le pas des changements

Sujets

void threaded_function(Model_factory &mf, ppa::Node *root) { // threads management 

try { // n try... 

principales

int main(int argc, char *argv[]) { ... 

dans l'ensemble je crée une racine de noeud, puis dans le noeud fils est donné séquences et a un bool qui change à vrai comme:

ppa::Node *root; 

Et dans les fils travaille (un groupe de threads) je peux obtenir et définir que bool comme je le souhaite, mais quand le groupe de fil se termine par se joindre à tous (coup de pouce) la racine du pointeur me donne 0 sur cette ligne

cout << root->has_sequence() << endl; 

Après cela continue et le nœud est rempli à nouveau avec quelque chose, alors ce que je veux demander est pourquoi mon pointeur de nœud ne reflète pas les changements dans les fils, est-il concevoir ou je me trompe (probablement le second) et que devrais-je faire un nœud racine global qui va résoudre mon problème, mais pourquoi?

+0

Les fils sont durs. – jahhaj

+2

Pouvez-vous le réduire à un * minimal * mais complet exemple qui reproduit le problème peut-être? J'essaierais de courir et d'étudier quelque chose de plus petit, mais actuellement c'est trop grand, il manque un 'main()' et dépend de choses externes que nous ne pouvons pas voir. Avez-vous essayé de l'exécuter dans quelque chose comme Helgrind? – Flexo

+2

C'est beaucoup de code – mathematician1975

Répondre

1

Si vous avez une condition de concurrence, vous devez suspecter que vous accédez aux sections critiques déverrouillées. Je remarque que vous verrouillez et déverrouillez manuellement votre variable mutex. Cela pourrait entraîner des erreurs dans votre code. Par exemple, cette construction semble particulièrement alarmante:

for (int i = 0; i < deque_done.size(); i++) { 

    tuple_compare(deque_done.at(i)); 

    result_mutex.unlock(); 

} 

, vous pouvez au lieu de verrouillage et déverrouillage manuel envisager d'utiliser boost::recursive_mutex et boost::recursive_mutex::scoped_lock pour gérer l'acquisition et la libération de verrouillage.

boost::recursive_mutex result_mutex; 

void foo() { 
    boost::recursive_mutex::scoped_lock lock(result_mutex); 
    //... 
} 

Si vous insistez vraiment sur la conception d'un algorithme récursif qui permet réentrée de plusieurs threads, vous pouvez peut-être utiliser un boost::shared_mutex et boost::shared_lock/boost::upgradeable_lock pour la serrure de lecture et boost::unique_lock/boost::upgrade_to_unique_lock pour un accès en écriture. You can follow this link for an example.

+0

comment cela ira, pouvez-vous mettre un exemple de ceci. (: –

+0

@ user1423656: J'ai ajouté un lien pour le 'shared_mutex', et un exemple simple pour' recursive_mutex'. Cordialement – jxh

+0

merci, je vais vérifier –

Questions connexes