Partage
  • Partager sur Facebook
  • Partager sur Twitter

condition_variable

C++

10 juillet 2019 à 3:26:44

Bonsoir

sur cet exemple de cppreference, il y a la phrase que je ne comprends pas pour l'instant :

// Manual unlocking is done before notifying, to avoid waking up
    // the waiting thread only to block again (see notify_one for details)

https://en.cppreference.com/w/cpp/thread/condition_variable

Pourriez-vous m'expliquer pourquoi le "unlock" est mis avant le "notify" ?

Quelle partie du code est bloquée ? Quelle partie ne veut-on pas réveiller ?

Ce n'est pas clair pour moi.

Merci par avance pour vos explications

-
Edité par pseudo-simple 10 juillet 2019 à 4:20:59

  • Partager sur Facebook
  • Partager sur Twitter
10 juillet 2019 à 7:17:03

Prends un papier et un crayon et dessine la timeline de ce qu'il se passe pour chaque ligne de code.

Quel cours suis tu pour apprendre la prog concurrente en C++ ?

Et change ton pseudo, c'est ridicule.

-
Edité par gbdivers 10 juillet 2019 à 7:17:19

  • Partager sur Facebook
  • Partager sur Twitter
10 juillet 2019 à 12:08:53

Cela fait plusieurs fois que je suis la timeline, mais je ne saisis pas ce qu'il se passe, d'où mon besoin d'aide.

Pouvez-vous m'expliquer le commentaire ?

Merci par avance

-
Edité par pseudo-simple 10 juillet 2019 à 12:44:12

  • Partager sur Facebook
  • Partager sur Twitter
10 juillet 2019 à 17:10:54

Ok, montres tes notes (au pire, prends une photo) de ce que tu as compris sur la timeline, on pourra te corriger.
  • Partager sur Facebook
  • Partager sur Twitter
10 juillet 2019 à 20:57:07

Voici mon parcours, pouvez-vous m'aider maintenant en apportant des précisions à ces éléments ? 

1) worker_thread est lancée dans le thread worker de manière asynchrone de manière non reportée

2) il demande le mutex avec son unique_lock .... déjà ici, j'ai un doute, car que se passe-t-il si en même dans le main (si je comprends bien, on peut avoir deux threads qui bloquent un mutex exactement en même temps ? ) , la section de code 

{
        std::lock_guard<std::mutex> lk(m);
        ready = true;
        std::cout << "main() signals data ready for processing\n";
    }

demande le mutex exactement en même temps ?

3) supposons que ce soit le unique_lock : alors au moment du cv.wait , il lâche le mutex et le thread patiente

4) puisque le mutex est lâché, on peut rentrer dans la section de code que je viens de citer (même si ce que je dis ne me paraît pas sûr) 

5) puis le cv.notify_one réveille le thread worker qui reprend car la condition ready est true, et le thread worker reprend le mutex.

6) Et c'est là que j'ai ma 3ème question :  pourquoi faire le unlock sur lk avant le notify_one ? est-ce pour que cv ne soit pas modifié dans deux régions qui demandent simultanément le mutex ?

Si oui, ce n'est pas ce que dit cppreference qui parle de réveil. Je ne comprends pas ce que ça veut dire : "the waiting thread only to block again"

-
Edité par pseudo-simple 11 juillet 2019 à 16:18:40

  • Partager sur Facebook
  • Partager sur Twitter
12 juillet 2019 à 0:11:03

Salut,

Encore une fois, tu t'attaques à des problèmes qui volent très largement au dessus de tes capacités de compréhensions actuelles.

Quand finiras tu donc par comprendre que, s'il n'y a rien  à vouloir dépasser ses limite pour évoluer, à la condition expresse de se fixer des objectifs accessibles, vouloir "bruler les étapes" en s'attaquant à des problèmes auxquels on est incapable de donner le moindre début d'explication n'est qu'une perte de temps teintée de masochisme ?

Encore une fois, tu te retrouves à tenter l'escalade de l'Everest, alors que tu es encore incapable de gravir la coline derrière chez toi sans devoir t'arrêter sans reprendre ton souffle.  Comment peux tu espérer y arriver sans risquer d'y perdre la vie?

-
Edité par koala01 12 juillet 2019 à 0:13:59

  • Partager sur Facebook
  • Partager sur Twitter
Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
12 juillet 2019 à 8:44:12

Et moi je veux pas que tu meures M. Compétent ! :(
  • Partager sur Facebook
  • Partager sur Twitter