IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Rester sur un thread tant qu'une action n'est pas finie


Sujet :

C#

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 3
    Points : 5
    Points
    5
    Par défaut Rester sur un thread tant qu'une action n'est pas finie
    Bonjour,

    la méthode lock() et la classe Monitor permettent d'empêcher à plusieurs thread d'accéder au même code en même temps, mais ce que je chercher moi c'est comment forcer un thread à exécuter une portion de code jusqu'à la fin avant de céder la main à un autre.

    Par exemple j'ai un thread A qui parcours une liste L d'objet avec un foreach(), si il cède la main à un thread B qui lui retire un élément de la liste L lorsque le thread A va reprendre la main le foreach va planter vu que la collection de la liste L aura changé. Donc ce que je voudrais faire c'est locker le thread A dès qu'il commence le foreach et jusqu'à ce qu'il l'ai finit.

    le foreach n'est qu'un exemple, c'est la même histoire par exemple pour du réseau lorsque on écrit dans un stream :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    streamWriter.WriteLine("Salut");
    streamWriter.Flush();
    Si le thread cède la main entre le WriteLine() et le Flush(), ça risque de cafouiller.

    Merci d'avance pour vos réponses,
    Slowman.

  2. #2
    Membre actif Avatar de polkduran
    Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 155
    Points : 275
    Points
    275
    Par défaut
    Normalement quand tu utilises un lock sur un objet et tu essayes de faire un autre lock sur le même objet dans un autre thread, le thread qui est en train d'exécuter du code sur l'objet "locké" ne "unlock" pas l'objet tant qu'il n'a pas finit ses traitements, donc faire un lock sur un objet est un moyen sûr de savoir que ton code sera exécuté jusqu'à la fin avant qu'autre thread essaye de locker le même object

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    class MaClass{
    	public static object objetLock = new Object();
     
    	public static void methodeA(){
    		lock(objetLock){
    			//traitements sur des flux
    		}
    	}
     
    	public static void methodeB(){
    		lock(objetLock){
    			//traitements sur des flux
    		}
    	}
     
    	public static void Main(){
    		Thread tA = new Thread(new ThreadStart(methodeA));
    		Thread tB = new Thread(new ThreadStart(methodeB));
     
    		tA.start();
    		tB.start();
    	}
     
    }
    ici les traitements de methodeB ne pourront pas se faire tant que methodeA n'a pas libéré le lock sur objectLock, donc tu peux faire des opérations sur des flux à l'intérieur des locks sans risque

    http://msdn.microsoft.com/en-us/libr...cz(VS.71).aspx

  3. #3
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    tu n'as pas besoin de créer un nouvel objet spécifique pour le lock tu peux locker directement ta liste et ainsi t'assurer que lorsque le thread 1 lit alors le thread 2 ne supprime pas.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    static class MyThread
    {
     
    private static List<Object> _list = new List<Object>() ;
     
    public static void Start()
    {
     new Thread(new ThreadStart(ExecuteRead)).Start();
     new Thread(new ThreadStart(ExecuteOther)).Start();
    }
     
    void ExecuteRead()
    {
    //parcourt de la liste avec un foreach
      lock(_list)
    {
       foreach(Object o in _list);
    }
    }
     
     
    void ExecuteOther()
    {
       lock(_list)
    {
     //travail sur la liste (ajout, suppression,...)
    }
    }
    }
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par Slowman Voir le message
    Bonjour,

    la méthode lock() et la classe Monitor permettent d'empêcher à plusieurs thread d'accéder au même code en même temps, mais ce que je chercher moi c'est comment forcer un thread à exécuter une portion de code jusqu'à la fin avant de céder la main à un autre.

    lock et monitor peuvent verrouiller plusieurs lignes de code
    donc je vois pas ce que tu cherches

    après si tu t'es mal exprimé et/ou que j'ai mal compris, tu peux jeter un oeil aux manualresetevent, ou à thread.join
    et au passage au readerwriterlock[slim] qui permet d'optimiser certains locks
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    et au passage au readerwriterlock[slim] qui permet d'optimiser certains locks
    Je ne connais pas ce "readerwriterlock" ? tu peux préciser ?

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    F1 ou google

    m'enfin c'est une extension du lock en gros
    au lieu de verrouiller dans tous les cas t'as 2 type de verrouillage, ca permet des perfs en lecture sans bloquer pour rien et un verrouillage en écriture pour la sécurité
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    F1 ou google

    m'enfin c'est une extension du lock en gros
    au lieu de verrouiller dans tous les cas t'as 2 type de verrouillage, ca permet des perfs en lecture sans bloquer pour rien et un verrouillage en écriture pour la sécurité
    Je viens en effet de voir cette classe que je ne connaissais pas. (alors qu'elle existe depuis le 1.0 !!!!!!!!!!!)

    C'est pas tous les jours que je découvre une classe du framework que je ne connais pas.

    Ca s'arrose, je vais aller boire un café tiens.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    et pourtant je t'assure qu'il y en a des tas d'autres que tu ne connais pas ^^
    personne ne peut connaitre 100% du framework

    et puis ne serait-ce que celles qui sont internal/friend mais qui peuvent être attaqué par reflexion quand même xD


    et y a le readerwriterlockslim qui est apparu avec le fx 3.5 qui est le meme en plus simple
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Futur Membre du Club
    Inscrit en
    Août 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 3
    Points : 5
    Points
    5
    Par défaut
    En effet j'avais comprit de travers lock et la manière dont je l'avais testé était foireuse. C'est bien ça que je cherchais.

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2013] Afficher un userform tant qu'une condition n'est pas realisée
    Par Nono Sto dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 05/09/2014, 23h57
  2. Réponses: 4
    Dernier message: 03/10/2010, 11h30
  3. revenir sur la page courante après une action
    Par Altenide dans le forum Struts 2
    Réponses: 8
    Dernier message: 08/04/2010, 11h41
  4. Réponses: 4
    Dernier message: 05/05/2009, 09h54
  5. Blocage tant qu'une fenêtre n'est pas fermé
    Par lodan dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/09/2006, 07h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo