Wat voor soort synchronisatie heeft deze code nodig?

I have a threaded server application that stores List dataList. There is a single writing thread that modifies, adds and removes items from the list, and multiple threads that read from this list.

Wat voor soort synchronisatie is vereist om ervoor te zorgen dat de schrijfbewerkingen in de juiste volgorde plaatsvinden terwijl ze werden aangeroepen en maximale prestaties bieden voor de leesacties, dat wil zeggen dat als een schrijf bezig is, moet de vorige waarde vóór de leesbewerking worden opgegeven.

Ik gebruik momenteel ReaderWriterLockSlim vanwege de afzonderlijke lees- en schrijfvergrendelingsmogelijkheden, maar het lijkt alsof er veel dure overheadkosten zijn om de ReadLocks te bellen. Dit is onnodig omdat ik alleen wil dat de boeken worden gegarandeerd in de juiste volgorde ?

Voor zover ik begrijp, moeten leesreferentietypes en waardetypes atoomtoegang bieden, zodat vergrendeling misschien niet nodig is?

Prestaties zijn een grote zorg en het lijkt erop dat optimalisatie van mijn synchronisatiestructuur behoorlijk zou kunnen verbeteren.

3

3 antwoord

Sounds like you have a producer/consumer pattern. In .Net 4, there is the ConcurrentQueue class in the System.Threading.Concurrent namespace. You are only synchronising when adding and removing from queue.

2
toegevoegd

ReaderWriterLockSlim isn't really needed here, unless there is a chance you cannot enter the lock for some significant reason.
A Simple Lock(syncObj) would suffice, just place locks before read/write operations.

Als TryEnter nodig is, moeten we uw code bekijken.

1
toegevoegd
Ja, u hebt gelijk en ReaderWriterLockSlim biedt u hier een goede oplossing. Gelijktijdige wachtrij is niet goed genoeg, want 1. u gebruikt geen wachtrij, 2. als u een item wijzigt, hebben uw consumenten mogelijk toegang tot ongeldige gegevens.
toegevoegd de auteur Erez Robinson, de bron
Dit zou niet ideaal zijn voor zover ik sloten begrijp, omdat dan in feite slechts één thread tegelijk kan lezen, omdat we zowel lezen als schrijven op hetzelfde object vergrendelen.
toegevoegd de auteur Vort3x, de bron

Zonder synchronisatie bestaat de kans dat een read gedeeltelijke informatie krijgt van vóór en na de schrijfbewerking (bijvoorbeeld 30% van de oude lijst en 70% van de nieuwe lijst). Als dit geen probleem is, hoeft u geen synchronisatie te gebruiken zolang er maar één schrijver is.

Als uw lijst objecten bevat, geeft u er misschien de voorkeur aan uw nieuwe gegevens in een nieuw object te schrijven en verwisselt u dit nieuwe element met de in-lijst. Het veranderen van een referentie zou atomair moeten zijn, tenzij er een interne mechanica is waar ik geen weet van heb.

Object temp = new Object();
temp.value = 5;
temp.name = "whatever";
list[5] = temp;

in plaats van:

list[5].value = 5;
list[5].name = "whatever";
0
toegevoegd
Toegang tot de itemeigenschappen via directe benadering is niet anders dan het gebruik van een indirecte aanwijzer. Het is hetzelfde, de producer-thread kan nog steeds de eigenschappen van het item wijzigen.
toegevoegd de auteur Erez Robinson, de bron