[C#] Parallel lezen en schrijven van gedeelde resource

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Ik heb een class die door verschillende threads zeer veel gebruikt wordt. Het is van belang dat dit zo snel mogelijk gaat en dat methodes zoveel mogelijk parallel uitgevoerd kunnen worden.
Nou bevat deze class een resource welke gedeeld wordt door de methodes, bijvoorbeeld een bestand. Ik heb twee methodes die deze resource alleen lezen en 1 methode die de resource leest en schrijft:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class MijnKlasse
{
  public void DoeLeesActie1
  {
    //Gebruik gedeelde resource om te lezen
  }

  public void DoeLeesActie2
  {
    //Gebruik ook gedeelde resource om te lezen
  }

  public void DoeLeesEnSchrijfActie
  {
    //Gebruik gedeelde resource om te lezen en te schrijven
  }
}

Ik wil dat DoeLeesActie1 en DoeLeesActie2 parallel te gebruiken is door verschillende threads. Maar als DoeLeesEnSchrijfActie wordt uitgevoerd moeten de lees-acties wachten. Wordt er 1 van de 2 lees-acties uitgevoerd (of beide) dan moet de lees-en-schrijf-actie wachten.

Hoe los ik dit het beste op?

"The shell stopped unexpectedly and Explorer.exe was restarted."


Acties:
  • 0 Henk 'm!

  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Lees je eens in over het gebruik van locks en mutexen.
Met die mechanismen kun je acties thread safe maken en zorgen dat je threads wachten wanneer een resource in gebruik is.

Zie ook het voorbeeld op MSDN

[ Voor 24% gewijzigd door MTWZZ op 08-02-2010 11:18 ]

Nu met Land Rover Series 3 en Defender 90


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Nu online
Kan je geen Mutex gebruiken.
DoeLeesEnSchrijfActie 'zet' de Mutex.
DoeLeesActie1 kan alleen maar lezen als de Mutex vrij is
DoeLeesActie2 kan ook alleen maar lezen als de Mutex vrij is.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

whoami schreef op maandag 08 februari 2010 @ 11:17:
Kan je geen Mutex gebruiken.
DoeLeesEnSchrijfActie 'zet' de Mutex.
DoeLeesActie1 kan alleen maar lezen als de Mutex vrij is
DoeLeesActie2 kan ook alleen maar lezen als de Mutex vrij is.
Maar dan heb je nog niet afgedekt dat "DoeLeesEnSchrijf" niet mag starten wanneer "DoeLeesX" bezig is.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Nu online
Janoz schreef op maandag 08 februari 2010 @ 11:21:
[...]

Maar dan heb je nog niet afgedekt dat "DoeLeesEnSchrijf" niet mag starten wanneer "DoeLeesX" bezig is.
Ah, ok, daar had ik over gelezen. :P
Nuja, ook voor dat blijft het principe 't zelfde natuurlijk, maar dan omgekeerd.

[ Voor 3% gewijzigd door whoami op 08-02-2010 11:23 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
MTWZZ schreef op maandag 08 februari 2010 @ 11:16:
Lees je eens in over het gebruik van locks en mutexen.
Met die mechanismen kun je acties thread safe maken en zorgen dat je threads wachten wanneer een resource in gebruik is.

Zie ook het voorbeeld op MSDN
Ik heb daar al naar gekeken en gebruik nu lock, alleen dat is teveel van het goede. Het kan sneller doordat DoeLeesActie1 en DoeLeesActie2 prima parallel kunnen worden uitgevoerd. Als ik alles afdek met 1 lock dan moeten ze steeds wachten en dat is zonde.

"The shell stopped unexpectedly and Explorer.exe was restarted."


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Locks zijn hier dan ook niet de oplossing. Mutexen zullen beter werken. Whoami's oplossing is al op de helft.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Meer locks gebruiken dus, want zoals whoami en Janoz al opmerken met 1 kom je er niet.

Nu met Land Rover Series 3 en Defender 90


Acties:
  • 0 Henk 'm!

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Janoz schreef op maandag 08 februari 2010 @ 11:28:
Locks zijn hier dan ook niet de oplossing. Mutexen zullen beter werken. Whoami's oplossing is al op de helft.
Ik ga het proberen met 2 mutexen, bedankt!
Aangezien ik zeker wil zijn dat dit goed gaat werken post ik straks toch even mijn oplossing om te controleren. Ik wil straks namelijk geen vage fouten in de productieomgeving.

"The shell stopped unexpectedly and Explorer.exe was restarted."


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

@MTWZZ: Ik zeg helemaal niet dat je meer locks moet gebruiken, maar dat je mutexen moet gebruiken ;).

@jelmervos: Zulke multithreading issues zijn inderdaad erg nasty. Vooral omdat ze zo moeilijk te testen zijn en bugs eigenlijk nauwelijks (consequent) te reproduceren zijn.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Ik loop nu pas tegen de ReaderWriterLockSlim aan:
Represents a lock that is used to manage access to a resource, allowing multiple threads for reading or exclusive access for writing.
Is dat niet precies wat ik nodig heb?

Heb even verder gekeken, en het lijkt erop dat de writer lock ook pas wordt opgeheven als alle readers klaar zijn.

[ Voor 15% gewijzigd door jelmervos op 08-02-2010 11:51 ]

"The shell stopped unexpectedly and Explorer.exe was restarted."


Acties:
  • 0 Henk 'm!

  • djexplo
  • Registratie: Oktober 2000
  • Laatst online: 07-07 15:40
Is inderdaad een handige functie, die alle read en write acties tegen houd zolang er een thread aan het schrijven is. Dus daardoor krijg je nooit half geschreven informatie terug, of andere problemen.

'if it looks like a duck, walks like a duck and quacks like a duck it's probably a duck'


Acties:
  • 0 Henk 'm!

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Ik denk dat ik die maar ga gebruiken, ga niet 2x het wiel uitvinden. Bedankt voor het meedenken!

[ Voor 17% gewijzigd door jelmervos op 08-02-2010 11:59 ]

"The shell stopped unexpectedly and Explorer.exe was restarted."

Pagina: 1