🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: nl.comp.programmeren
10 messages
10 total messages Started by Luk Vloemans Fri, 05 Sep 2003 13:41
Threads in C#
#504
Author: Luk Vloemans
Date: Fri, 05 Sep 2003 13:41
24 lines
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#
#505
Author: Stefan Arentz
Date: Fri, 05 Sep 2003 14:40
66 lines
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#
#506
Author: Luc Kumps
Date: Fri, 05 Sep 2003 14:50
36 lines
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#
#497
Author: Geert M
Date: Mon, 08 Sep 2003 19:43
41 lines
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#
#498
Author: Stefan Arentz
Date: Mon, 08 Sep 2003 19:46
16 lines
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#
#499
Author: Geert M
Date: Mon, 08 Sep 2003 19:59
30 lines
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#
#500
Author: Stefan Arentz
Date: Mon, 08 Sep 2003 20:00
15 lines
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#
#501
Author: Geert M
Date: Mon, 08 Sep 2003 20:10
9 lines
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#
#502
Author: su
Date: Mon, 08 Sep 2003 20:30
34 lines
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#
#503
Author: su
Date: Mon, 08 Sep 2003 20:34
13 lines
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