<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"><channel><category>pcsoft.fr.windev</category><copyright>Copyright 2026, PC SOFT</copyright><lastBuildDate>7 Dec 2018 15:07:12 Z</lastBuildDate><pubDate>5 Dec 2018 11:04:01 Z</pubDate><description>Bonjour,&#13;
Si vous avez comme moi à accéder à des zones mémoires, tableau en lecture, écriture par plusieurs threads, vous vous êtes surement cassé la tête avec des section critiques bloquantes et non performante.&#13;
&#13;
J'ai fait une mise en oeuvre avec une classe qui implémente  le patron décrit par Wikipédia: https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock&#13;
&#13;
Je vous soumet donc cette classe qui peut être utiliser de n'importe où en instanciant un objet local soit en lecture ou en écriture.&#13;
&#13;
Tout se passe dans le constructeur, destructeur.&#13;
&#13;
Le gros avantage est qu'il peut y avoir autant de lecteurs que l'on veut mais un et un seul écrivain. Et lorsque l'écrivain prends la main, on est assuré que les lecteurs sont sortis et qu'ils vont attendre la fin de l'écriture.&#13;
&#13;
[code:wl]&#13;
ETypeAccèsMémoire est un Enumération&#13;
	AccèsLecture=1&#13;
	AccèsÉcriture=2&#13;
FIN&#13;
clAccèsMémoire est une Classe	&#13;
	CONSTANTE&#13;
		PREFIXE_MUTEX_="MUTEX_ZONEMEMOIRE_"&#13;
		PREFIXE_SIGNAL_="SIGNAL_ZONEMEMOIRE_"&#13;
	FIN&#13;
PRIVÉ	&#13;
	m_sZoneMémoire est une chaîne&#13;
	m_eType	est un ETypeAccèsMémoire&#13;
GLOBAL&#13;
	mg_taLecteur	est un tableau associatif d'entiers//Clé: nom de la zone à protéger, nombre de lecteurs&#13;
	mg_taMutex		est un tableau associatif de chaîne//Clé: nom de la zone à protéger&#13;
	mg_taÉcriture	est un tableau associatif de booléen//Clé: nom de la zone à protéger, état si en écriture&#13;
FIN&#13;
&#13;
PROCÉDURE Constructeur(sZoneMémoire est une chaîne, eType est un ETypeAccèsMémoire)&#13;
m_sZoneMémoire=ChaîneFormate(sZoneMémoire,ccSansAccent+ccSansEspace+ccMajuscule)&#13;
m_eType=eType&#13;
SI mg_taLecteur[m_sZoneMémoire]..Vide ALORS&#13;
	GénérerAccès(m_sZoneMémoire)&#13;
FIN&#13;
SELON m_eType&#13;
	CAS AccèsLecture&#13;
		//Wikipédia: &#13;
		//Lock m (blocking).&#13;
		//While w:&#13;
		//	wait c, m[a]&#13;
		//Increment r.&#13;
		//Unlock m.&#13;
		MutexDébut(PREFIXE_MUTEX_+m_sZoneMémoire)&#13;
		TANTQUE mg_taÉcriture[m_sZoneMémoire]&#13;
			MutexFin(PREFIXE_MUTEX_+m_sZoneMémoire)&#13;
			SignalAttend(PREFIXE_SIGNAL_+m_sZoneMémoire)&#13;
			MutexDébut(PREFIXE_MUTEX_+m_sZoneMémoire)&#13;
		FIN		&#13;
		mg_taLecteur[m_sZoneMémoire]++//ici le thread a le lock&#13;
		SI EnModeTest() ALORS&#13;
			TraceConstruit("Lecture %1 compteur: %2",PREFIXE_MUTEX_+m_sZoneMémoire,mg_taLecteur[m_sZoneMémoire])&#13;
		FIN&#13;
		MutexFin(PREFIXE_MUTEX_+m_sZoneMémoire)//Release du lock&#13;
		//La lecture de l'accès mémoire peut commencer car la condition write est désactivé et le compteur&gt;0&#13;
	CAS AccèsÉcriture&#13;
		//Wikipédia: &#13;
		//Lock m (blocking).&#13;
		//While w:&#13;
		//	wait c, m&#13;
		//Set w to true.&#13;
		//While r &gt; 0:&#13;
		//	wait c, m&#13;
		//Unlock m.&#13;
		MutexDébut(PREFIXE_MUTEX_+m_sZoneMémoire)&#13;
		TANTQUE mg_taÉcriture[m_sZoneMémoire]&#13;
			MutexFin(PREFIXE_MUTEX_+m_sZoneMémoire)&#13;
			SignalAttend(PREFIXE_SIGNAL_+m_sZoneMémoire)&#13;
			MutexDébut(PREFIXE_MUTEX_+m_sZoneMémoire)&#13;
		FIN&#13;
		mg_taÉcriture[m_sZoneMémoire]=Vrai//ici le thread a le lock&#13;
		TANTQUE mg_taLecteur[m_sZoneMémoire]&gt;0&#13;
			MutexFin(PREFIXE_MUTEX_+m_sZoneMémoire)&#13;
			SignalAttend(PREFIXE_SIGNAL_+m_sZoneMémoire)&#13;
			MutexDébut(PREFIXE_MUTEX_+m_sZoneMémoire)&#13;
		FIN	&#13;
		SI EnModeTest() ALORS&#13;
			TraceConstruit("Écriture %1",PREFIXE_MUTEX_+m_sZoneMémoire)&#13;
		FIN&#13;
		MutexFin(PREFIXE_MUTEX_+m_sZoneMémoire)&#13;
		//L'écriture dans la zone mémoire peut commencer  car la condition write est activée	&#13;
FIN&#13;
PROCÉDURE Destructeur()&#13;
SI m_sZoneMémoire&lt;&gt;"" ALORS&#13;
	SELON m_eType&#13;
		CAS AccèsLecture&#13;
			//Wikipédia: Releasing a read lock is done by decrementing r and signalling c if r has become zero (both while holding m)&#13;
			//On doit reprendre le lock pour décrémenter et signaler si on est arrivé à zéro&#13;
			MutexDébut(PREFIXE_MUTEX_+m_sZoneMémoire)&#13;
			mg_taLecteur[m_sZoneMémoire]--&#13;
			SI mg_taLecteur[m_sZoneMémoire]=0 ALORS&#13;
				SignalOuvre(PREFIXE_SIGNAL_+m_sZoneMémoire)&#13;
			FIN&#13;
			SI EnModeTest() ALORS&#13;
				TraceConstruit("Fin lecture %1 compteur: %2",PREFIXE_MUTEX_+m_sZoneMémoire,mg_taLecteur[m_sZoneMémoire])&#13;
			FIN&#13;
			MutexFin(PREFIXE_MUTEX_+m_sZoneMémoire)&#13;
		CAS AccèsÉcriture&#13;
			//Wikipédia: Releasing the write lock means setting w to false and broadcasting on c (again while holding m).&#13;
			//On doit reprendre le lock pour désactiver la condition d'écriture&#13;
			MutexDébut(PREFIXE_MUTEX_+m_sZoneMémoire)&#13;
			mg_taÉcriture[m_sZoneMémoire]=Faux&#13;
			SignalOuvre(PREFIXE_SIGNAL_+m_sZoneMémoire)&#13;
			SI EnModeTest() ALORS&#13;
				TraceConstruit("Fin écriture %1",PREFIXE_MUTEX_+m_sZoneMémoire)&#13;
			FIN&#13;
			MutexFin(PREFIXE_MUTEX_+m_sZoneMémoire)&#13;
	FIN	&#13;
FIN&#13;
&#13;
[/code]&#13;
&#13;
Vous n'avez donc qu'a instancier un objet de lecture avec eType=AccèsLecture et avec eType=AccèsÉcriture pour l'écriture juste avant les portions de codes correspondantes. Vous devez bien sur utiliser la même chaîne sZoneMémoire dans le constructeur pour contrôler le même élément mémoire.&#13;
&#13;
--&#13;
Youri JUTEAU&#13;
Montréal</description><ttl>30</ttl><generator>WEBDEV</generator><language>fr_FR</language><link>https://forum.pcsoft.fr/es-ES/pcsoft.fr.windev/222394-multiple-reader-single-writer-implantation/read.awp</link><title>Multiple reader/single writer implantation</title><managingEditor>moderateur@pcsoft.fr (El moderador)</managingEditor><webMaster>webmaster@pcsoft.fr (El webmaster)</webMaster><item><author>Youri JUTEAU</author><category>pcsoft.fr.windev</category><comments>https://forum.pcsoft.fr/es-ES/pcsoft.fr.windev/222394-multiple-reader-single-writer-implantation-222468/read.awp</comments><pubDate>7 Dec 2018 15:07:12 Z</pubDate><description>Oui possible. Je vais l'ajouter pour voir. Mais je fonctione avec 12 threads qui se partage des dizaines d'endroits tant en lect…</description><guid isPermaLink="true">https://forum.pcsoft.fr/es-ES/pcsoft.fr.windev/222394-multiple-reader-single-writer-implantation-222468/read.awp</guid><link>https://forum.pcsoft.fr/es-ES/pcsoft.fr.windev/222394-multiple-reader-single-writer-implantation-222468/read.awp</link><source url="https://forum.pcsoft.fr/es-ES/pcsoft.fr.windev/222394-multiple-reader-single-writer-implantation/read.awp">Multiple reader/single writer implantation</source><title>Re: Multiple reader/single writer implantation</title></item><item><author>Olivier H</author><category>pcsoft.fr.windev</category><comments>https://forum.pcsoft.fr/es-ES/pcsoft.fr.windev/222394-multiple-reader-single-writer-implantation-222458/read.awp</comments><pubDate>7 Dec 2018 13:46:56 Z</pubDate><description>Bonjour,&#13;
&#13;
Merci pour le partage, cela est intéressant.&#13;
Cependant, il manque la fonction GénérerAccès()&#13;
ca devrait être ?[cod…</description><guid isPermaLink="true">https://forum.pcsoft.fr/es-ES/pcsoft.fr.windev/222394-multiple-reader-single-writer-implantation-222458/read.awp</guid><link>https://forum.pcsoft.fr/es-ES/pcsoft.fr.windev/222394-multiple-reader-single-writer-implantation-222458/read.awp</link><source url="https://forum.pcsoft.fr/es-ES/pcsoft.fr.windev/222394-multiple-reader-single-writer-implantation/read.awp">Multiple reader/single writer implantation</source><title>Re: Multiple reader/single writer implantation</title></item></channel></rss>
