Thread View: nl.comp.programmeren
10 messages
10 total messages
Started by Luk Vloemans
Fri, 05 Sep 2003 13:41
Threads in C#
Author: Luk Vloemans
Date: Fri, 05 Sep 2003 13:41
Date: Fri, 05 Sep 2003 13:41
24 lines
2069 bytes
2069 bytes
Hey, Ik heb een aantal problemen met threads in C#. In de msdn documentatie hebben ze het i.v.m. mutual exclusion enkel over threads die dezelfde functie uitvoeren. Het gaat er dan om hoe je een kritiek stuk in die functie kan locken. Wat is nu de precieze betekenis van de lock functie (en zijn argument)? Het enige wat mijn bedoeling is, is andere threads voorkomen van hun kritische secties binnen te gaan, als de huidige thread in een kritieke sectie zit. Ik heb een aantal gedeelde variabelen, die van status veranderd moeten worden door de ene thread, om dan opgemerkt te worden in de andere (booleanse variabelen). Ik heb twee threads in de hoofdklasse, en 1 in een andere klasse. De kritische secties bevinden zich trouwens in verschillende methodes (vandaar dat het msdn voorbeeld niet erg nuttig was). Kan iemand me helpen? Alvast bedankt, Luk Vloemans
Re: Threads in C#
Author: Stefan Arentz
Date: Fri, 05 Sep 2003 14:40
Date: Fri, 05 Sep 2003 14:40
66 lines
3191 bytes
3191 bytes
Luk Vloemans <luk.vloemans@student.luc.ac.be> writes:
> Hey,
>
> Ik heb een aantal problemen met threads in C#. In de msdn documentatie
> hebben ze het i.v.m. mutual exclusion enkel over threads die dezelfde
> functie uitvoeren. Het gaat er dan om hoe je een kritiek stuk in die
> functie kan locken.
>
> Wat is nu de precieze betekenis van de lock functie (en zijn argument)?
>
> Het enige wat mijn bedoeling is, is andere threads voorkomen van hun
> kritische secties binnen te gaan, als de huidige thread in een
> kritieke sectie zit. Ik heb een aantal gedeelde variabelen, die van
> status veranderd moeten worden door de ene thread, om dan opgemerkt te
> worden in de andere (booleanse variabelen). Ik heb twee threads in de
> hoofdklasse, en 1 in een andere klasse.
>
> De kritische secties bevinden zich trouwens in verschillende methodes
> (vandaar dat het msdn voorbeeld niet erg nuttig was).
>
> Kan iemand me helpen?
Ik ben meer een Java persoon, maar dit zal wel redelijk kloppen :-)
class Foo
{
private String mData;
public Foo(String data)
{
mData = data;
}
public void Boe()
{
lock (mData)
{
// Doe iets met mData
}
}
public void Bah()
{
lock (mData)
{
// Doe iets met mData
}
}
}
(Vervang overigens 'lock' met 'synchronize' en het is opeens een Java
voorbeeld :)
Als je nu vanuit meerdere threads de zelfde Foo instance gebruikt dan
zorgen de lock blocks er voor dat er maar 1 thead tegelijk aan mData
kan zitten. Een andere thread zal dan wachten tot de huidige klaar is
en dan de lock claimen.
Het argument van lock() moet een object zijn. De runtime kent dan een
mutex toe aan dat object om de exlusieve toegang te regelen.
Voor details over mutexen (mutual-exclusion locks) moeten je maar zelf
even google raadplegen.
S.
Re: Threads in C#
Author: Luc Kumps
Date: Fri, 05 Sep 2003 14:50
Date: Fri, 05 Sep 2003 14:50
36 lines
2457 bytes
2457 bytes
"Luk Vloemans" <luk.vloemans@student.luc.ac.be> wrote in message
news:bja3q9$kfs$1@nl-news.euro.net...
> Hey,
>
> Ik heb een aantal problemen met threads in C#. In de msdn documentatie
> hebben ze het i.v.m. mutual exclusion enkel over threads die dezelfde
> functie uitvoeren. Het gaat er dan om hoe je een kritiek stuk in die
> functie kan locken.
>
> Wat is nu de precieze betekenis van de lock functie (en zijn argument)?
>
> Het enige wat mijn bedoeling is, is andere threads voorkomen van hun
> kritische secties binnen te gaan, als de huidige thread in een kritieke
> sectie zit. Ik heb een aantal gedeelde variabelen, die van status
> veranderd moeten worden door de ene thread, om dan opgemerkt te worden
> in de andere (booleanse variabelen). Ik heb twee threads in de
> hoofdklasse, en 1 in een andere klasse.
>
> De kritische secties bevinden zich trouwens in verschillende methodes
> (vandaar dat het msdn voorbeeld niet erg nuttig was).
Zijn dat verschillende methodes van ��n enkel object?
Dan kun je simpelweg
lock(this) {
// mutual exclusive code
}
gebruiken.
Het is de bedoeling dat je aan lock de referentie van een object doorgeeft.
Je moet dezelfde referentie doorgeven aan alle muteel exclusieve lock
sections.
Luc K
Re: Threads in C#
Author: Geert M
Date: Mon, 08 Sep 2003 19:43
Date: Mon, 08 Sep 2003 19:43
41 lines
2666 bytes
2666 bytes
Ik heb een soortgelijk probleem in dotnet (wel vb.net) maar de logica blijft dezelfde. Ik wil eenzelfde functie 5 maal tegelijk laten lopen (in 5 simultane gelijke threads). Het probleem is dat ze dezelfde connectie naar een SQL server hebben. Als de ene thread de connectie opent, kan de andere ze ondertussen terug sluiten, ... Dat "locken" van een stuk van de thread bleek niet echt de oplossing te zijn. Iemand suggesties tot oplossing. mvg Geert "Luk Vloemans" <luk.vloemans@student.luc.ac.be> wrote in message news:bja3q9$kfs$1@nl-news.euro.net... > Hey, > > Ik heb een aantal problemen met threads in C#. In de msdn documentatie > hebben ze het i.v.m. mutual exclusion enkel over threads die dezelfde > functie uitvoeren. Het gaat er dan om hoe je een kritiek stuk in die > functie kan locken. > > Wat is nu de precieze betekenis van de lock functie (en zijn argument)? > > Het enige wat mijn bedoeling is, is andere threads voorkomen van hun > kritische secties binnen te gaan, als de huidige thread in een kritieke > sectie zit. Ik heb een aantal gedeelde variabelen, die van status > veranderd moeten worden door de ene thread, om dan opgemerkt te worden > in de andere (booleanse variabelen). Ik heb twee threads in de > hoofdklasse, en 1 in een andere klasse. > > De kritische secties bevinden zich trouwens in verschillende methodes > (vandaar dat het msdn voorbeeld niet erg nuttig was). > > Kan iemand me helpen? > > Alvast bedankt, > > Luk Vloemans >
Re: Threads in C#
Author: Stefan Arentz
Date: Mon, 08 Sep 2003 19:46
Date: Mon, 08 Sep 2003 19:46
16 lines
1906 bytes
1906 bytes
"Geert M" <mvmelle@yahoo.com> writes: > Ik heb een soortgelijk probleem in dotnet (wel vb.net) maar de logica blijft > dezelfde. > Ik wil eenzelfde functie 5 maal tegelijk laten lopen (in 5 simultane gelijke > threads). Het probleem is dat ze dezelfde connectie naar een SQL server > hebben. Als de ene thread de connectie opent, kan de andere ze ondertussen > terug sluiten, ... > Dat "locken" van een stuk van de thread bleek niet echt de oplossing te > zijn. > Iemand suggesties tot oplossing. Pooled database connecties gebruiken? Vrij standaardin Java. Zal in .Net ook wel bestaan. S.
Re: Threads in C#
Author: Geert M
Date: Mon, 08 Sep 2003 19:59
Date: Mon, 08 Sep 2003 19:59
30 lines
2307 bytes
2307 bytes
In .net worden ze standaard gepooled. Het probleem is ik doe in de threads een connection.open en een connection.close. Het gebeurt natuurlijk dat de ene thread de connectie opent, en de andere thread ze een halve seconde later sluit. Ik kan natuurlijk aparte connecties per thread, maar wat doe ik dan als ik 10 of 20 of ... threads wil laten lopen "Stefan Arentz" <stefan.arentz@soze.com> wrote in message news:877k4jnjvo.fsf@keyser.soze.com... > "Geert M" <mvmelle@yahoo.com> writes: > > > Ik heb een soortgelijk probleem in dotnet (wel vb.net) maar de logica blijft > > dezelfde. > > Ik wil eenzelfde functie 5 maal tegelijk laten lopen (in 5 simultane gelijke > > threads). Het probleem is dat ze dezelfde connectie naar een SQL server > > hebben. Als de ene thread de connectie opent, kan de andere ze ondertussen > > terug sluiten, ... > > Dat "locken" van een stuk van de thread bleek niet echt de oplossing te > > zijn. > > Iemand suggesties tot oplossing. > > Pooled database connecties gebruiken? Vrij standaardin Java. Zal in .Net ook > wel bestaan. > > S.
Re: Threads in C#
Author: Stefan Arentz
Date: Mon, 08 Sep 2003 20:00
Date: Mon, 08 Sep 2003 20:00
15 lines
1992 bytes
1992 bytes
"Geert M" <mvmelle@yahoo.com> writes: > In .net worden ze standaard gepooled. > Het probleem is ik doe in de threads een connection.open en een > connection.close. > Het gebeurt natuurlijk dat de ene thread de connectie opent, en de andere > thread ze een halve seconde later sluit. > Ik kan natuurlijk aparte connecties per thread, maar wat doe ik dan als ik > 10 of 20 of ... threads wil laten lopen Meestal is dat geen probleem. Vraag het je database beheerder :-) Anders moet je zelf zorgen voor exclusieve toegang tot die database connectie, maar als 20 threads 1 connectie moeten delen dan kan je rekenen op gedoe. S.
Re: Threads in C#
Author: Geert M
Date: Mon, 08 Sep 2003 20:10
Date: Mon, 08 Sep 2003 20:10
9 lines
1741 bytes
1741 bytes
> Meestal is dat geen probleem. Vraag het je database beheerder :-) Anders > moet je zelf zorgen voor exclusieve toegang tot die database connectie, > maar als 20 threads 1 connectie moeten delen dan kan je rekenen op gedoe. > > S. Je bevestigd alleen mijn probleem, nu nog een oplossing :) Ik kan natuurlijk de databaseconnectie altijd laten open liggen voor alle threads, maar dat is niet echt wat ik zoek.
Re: Threads in C#
Author: su
Date: Mon, 08 Sep 2003 20:30
Date: Mon, 08 Sep 2003 20:30
34 lines
2248 bytes
2248 bytes
Luk:
> Ik heb een aantal problemen met threads in C#. In de msdn documentatie
> hebben ze het i.v.m. mutual exclusion enkel over threads die dezelfde
> functie uitvoeren. Het gaat er dan om hoe je een kritiek stuk in die
> functie kan locken.
>
> Wat is nu de precieze betekenis van de lock functie (en zijn argument)?
het is shorthand voor:
System.Threading.Monitor.Enter(this);
try {
...
}
finally {
System.Threading.Monitor.Exit(this);
}
de werking van Enter() is om te controleren of de object een lock heeft
uitstaan, en zoniet om die te zetten. als er al een lock uitstaat, dan
blokkeert Enter() totdat de lock wordt vrijgegeven en zet dan zelf op z'n
beurt een lock. Exit() is om de lock te verwijderen, maar dat zal wel
duidelijk zijn.
> Het enige wat mijn bedoeling is, is andere threads voorkomen van hun
> kritische secties binnen te gaan, als de huidige thread in een kritieke
> sectie zit. Ik heb een aantal gedeelde variabelen, die van status
> veranderd moeten worden door de ene thread, om dan opgemerkt te worden
> in de andere (booleanse variabelen).
kijk dan ook naar de betekenis van Wait() en Pulse().
groetjes, su.
Re: Threads in C#
Author: su
Date: Mon, 08 Sep 2003 20:34
Date: Mon, 08 Sep 2003 20:34
13 lines
1610 bytes
1610 bytes
Geert: > In .net worden ze standaard gepooled. > Het probleem is ik doe in de threads een connection.open en een > connection.close. > Het gebeurt natuurlijk dat de ene thread de connectie opent, en de andere > thread ze een halve seconde later sluit. > Ik kan natuurlijk aparte connecties per thread, maar wat doe ik dan als ik > 10 of 20 of ... threads wil laten lopen reference counting.. groetjes, su.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads