..
[ Voor 102% gewijzigd door ? ? op 25-01-2013 09:41 ]
[ Voor 102% gewijzigd door ? ? op 25-01-2013 09:41 ]
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij
[ Voor 98% gewijzigd door ? ? op 25-01-2013 09:41 ]
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Dan start je één timer met een interval op 1 minuut (of hell, op 1 seconde voor mijn part) en check je telkens in het timer event welke acties van de drie (vier, whatever) er uitgevoerd moeten wordenFastman schreef op woensdag 10 juni 2009 @ 14:58:
Nee de intervallen zijn verschillend (send:15m, popcheck:10m, timeout:30m ofzo), my bad. slechts om te testen staan ze allemaal op 1 minuut.
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij
[ Voor 105% gewijzigd door ? ? op 25-01-2013 09:41 ]
Dus is het wel een probleem. Als het je niet lukt om de toegang tot de list concurent te krijgen dan kun je beter er maar voor zorgen dat er telkens maar 1 proces tegelijk draait. En dat is het makkelijkste wanneer je alle 3 de acties in 1 thread uitvoert.Fastman schreef op woensdag 10 juni 2009 @ 15:25:
De tijden zijn variabel, het zijn slechts voorbeeldjes, vrij in te stellen. En zelf de intervallen bijhouden is extra werk, dat regelt een timer voor je? De volgorde waarin ze starten is ook van geen probleem.
Het probleem is dat de statements in verschillende timers door elkaar uitgevoerd worden. => no problemo, ware het niet dat ze beiden op eenzelfde List zitten te werken en dat mag niet.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Je moet geen lock(this) gebruiken. Zeker als het alle 3 verschillende objecten en of classes zijn. Je moet ergens een static variabele hebben dan werkt het wel.Fastman schreef op woensdag 10 juni 2009 @ 15:25:
De tijden zijn variabel, het zijn slechts voorbeeldjes, vrij in te stellen. En zelf de intervallen bijhouden is extra werk, dat regelt een timer voor je? De volgorde waarin ze starten is ook van geen probleem.
Het probleem is dat de statements in verschillende timers door elkaar uitgevoerd worden. => no problemo, ware het niet dat ze beiden op eenzelfde List zitten te werken en dat mag niet.
Een lock(mailsSent) tijdens elke foreach loop van mailsSent List werkt niet:
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 lock (mailsSent) { foreach (long timeSent in mailsSent) { if (timeSent <= timestamp) { sendAlert(timeSent); todelete.Add(timeSent); } } Debug.WriteLine("Removing # items in mailsSent: " + todelete.Count.ToString()); foreach (long timeSent in todelete) { mailsSent.Remove(timeSent); } }
Nergens anders gebruik ik een foreach. Enkel in de 2 andere timers wordt iets toegevoegd aan de mailsSent.
code:
1 lock(this) { }
Werkt ook niet.
//1 timer en zelf controleren zal deze problemen niet geven, maar waarom zelf iets doen als er iets voor bestaat en ik zou graag weten hoe dit op te lossen.
[ Voor 9% gewijzigd door .Gertjan. op 10-06-2009 16:09 ]
The #1 programmer excuse for legitimately slacking off: "My code's compiling"
Firesphere: Sommige mensen verdienen gewoon een High Five. In the Face. With a chair.
[ Voor 11% gewijzigd door mOrPhie op 10-06-2009 16:16 ]
Een experimentele community-site: https://technobabblenerdtalk.nl/. DM voor invite code.
In een non-realtime systeem heb je geen enkele garantie over de tijd van een sleep/timer oid. Die 20ms die 21ms worden is een vrij optimitische situatie..Gertjan. schreef op woensdag 10 juni 2009 @ 16:07:
Vooral bij korte Thread.Sleeps zie je dat wel eens gebeuren. Dus bv 20ms, dan kan het wel eens zijn dat hij pas na 21ms wakker wordt). Het is volgens mij ook een minimum tijd dat hij gaat sleepen. Maar dat weet ik niet zeker.
Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.
farlane schreef op woensdag 10 juni 2009 @ 19:54:
[...]
In een non-realtime systeem heb je geen enkele garantie over de tijd van een sleep/timer oid. Die 20ms die 21ms worden is een vrij optimitische situatie.
The #1 programmer excuse for legitimately slacking off: "My code's compiling"
Firesphere: Sommige mensen verdienen gewoon een High Five. In the Face. With a chair.
Concurrency is erg ingewikkeld. 'lukraak' maar wat locking en monitoring toepassen zou ik niet aanraden. Zoals de code nu geschreven is (eerst een foreach en daarna al het behandelde wissen) is het niet mogelijk om meerdere processen van dezelfde lijst gebruik te laten maken. Het synchroniseren gebeurt vervolgens over de gehele actie. Door dit dan maar met locking en monitoring op te gaan lossen lijkt mij geen goed idee. Zoals ik eerder al zei is het behoorlijk ingewikkeld en voor je het weet heb je een prachtige deadlock gecreëerd, terwijl het helemaal geen voordelen heeft..Gertjan. schreef op woensdag 10 juni 2009 @ 16:07:
[...]
Je moet geen lock(this) gebruiken. Zeker als het alle 3 verschillende objecten en of classes zijn. Je moet ergens een static variabele hebben dan werkt het wel.
Je moet dus ergens een object maken dat je bij alle 3 gebruikt in de lock (ze moeten namelijk het zelfde locken anders is het idee een beetje weg).
Als lock niet werkt (of je wilt meer controle) kun je ook altijd nog Monitor.Enter en Monitor.Exit gebruiken, maar ook die moeten een object hebben wat ze kunnen locken. (met Monitor.Exit kun je ook buiten een bepaalde functie de lock weer verwijderen (automatische deadlock release ofzo), maar kan wel de code complexer)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| while (isProgramRunning){ if (tijdVoorSent < nu) { doeSentActie(); tijdVoorSent = nu + sentInterval; } if (tijdVoorPopCheck < nu) { doePopCheckActie(); tijdVoorPopCheck = nu + popCheckInterval; } if (tijdVoorTimeOutCheck < nu) { doeTimeOutCheckActie(); tijdVoorTimeOutCheck = nu + timeOutCheckInterval; } sleep(1 minuut); } |
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
I know. Was meer als antwoord waarom het mis ging (ik ga niemand aanraden om lukraak maar statements neer te plempen in de hoop dat het de gewenste resultaten oplevert). Concurrency is ingewikkeld en soms zo ingewikkeld dat het menselijk brein het eigenlijk niet meer kan begrijpen. Door verkeerde implementatie van concurrency kunnen heel veel dingen stuk gaan door bijvoorbeeld zoals je aangeeft deadlocks.Janoz schreef op donderdag 11 juni 2009 @ 10:13:
[...]
Concurrency is erg ingewikkeld. 'lukraak' maar wat locking en monitoring toepassen zou ik niet aanraden. Zoals de code nu geschreven is (eerst een foreach en daarna al het behandelde wissen) is het niet mogelijk om meerdere processen van dezelfde lijst gebruik te laten maken. Het synchroniseren gebeurt vervolgens over de gehele actie. Door dit dan maar met locking en monitoring op te gaan lossen lijkt mij geen goed idee. Zoals ik eerder al zei is het behoorlijk ingewikkeld en voor je het weet heb je een prachtige deadlock gecreëerd, terwijl het helemaal geen voordelen heeft.
The #1 programmer excuse for legitimately slacking off: "My code's compiling"
Firesphere: Sommige mensen verdienen gewoon een High Five. In the Face. With a chair.
Apple iPhone 16e LG OLED evo G5 Google Pixel 10 Samsung Galaxy S25 Star Wars: Outlaws Nintendo Switch 2 Apple AirPods Pro (2e generatie) Sony PlayStation 5 Pro
Tweakers is onderdeel van
DPG Media B.V.
Alle rechten voorbehouden - Auteursrecht © 1998 - 2025
•
Hosting door TrueFullstaq