Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Advanced Developers Conference     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: FAQ - WinAPI ::  "Thread-sicher"     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
cd9000
Unregistrierter




Beitrag cd9000 Unregistrierter 14:29:00 21.08.2001   Titel:   "Thread-sicher"            Zitieren

Hi!

Was bedeutet es eigentlich, eine Klasse thread-sicher zu programmieren?
Werbeunterbrechung
Unix-Tom
Moderator

Benutzerprofil
Anmeldungsdatum: 18.07.2000
Beiträge: 10376
Beitrag Unix-Tom Moderator 14:36:00 21.08.2001   Titel:              Zitieren

Das mehrere Threads auf Funktionen und Variablen dieser Klasse zugreifen können ohne sich im Weg zu sein.
Dh. z.B.:
Wenn ein Thread den Inhalt einer Variable ändert kann kein anderer auslesen da dem Thread beim schreiben in die Variable die Rechenzeit weggenommen werden kann un er deshalb mit dem schreiben nicht fertig wurde. Wenn in dieser Zeit ein anderer Thread auslesen möchte bekommt er im harmlosesten Fall nur Blödsinn geliefert.

_________________
Moderator für MFC, Linux und Datenbanken
Marc++us
Administrator

Benutzerprofil
Anmeldungsdatum: 05.04.2000
Beiträge: 16966
Beitrag Marc++us Administrator 14:42:00 21.08.2001   Titel:              Zitieren

Interessant, hatten wir erst gestern bei der "Konkurrenz": http://www.c-plusplus.de/ubb/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=5&t=000502

Das gesagte gilt genauso für Win32. Eine Klasse ist ja durch mehrere Attribute (Membervariablen) gekennzeichnet, z.B. ein Punkt x,y.

Angenommen Du hast nun ein setX und setY. Ein Thread schreibt, ein Thread liest. Du willst den Punkt 1,1 auf 2,2 setzen.

1,1 liegt an, Thread2 liest: 1,1
setX(2); Thread2 sieht: 2,1
setY(2); Thread2 sieht: 2,2

Nicht ganz der gewünschte Effekt, oder? Vor allem weil dies je nach Aufrufintervall und Priorität mehr oder weniger oft und stark passieren kann.

Daher macht man sowas:
1,1 liegt an, Thread2 liest: 1,1
LOCK Thread2 kann nicht auf Punkt zugreifen und wird angehalten
setX(2);
setY(2);
UNLOCK
2,2 liegt an, Thread2 darf wieder und liest 2,2

Übrigens, der Gedanke eine Funktion setXY(2,2) einzuführen ist NICHT ausreichend, weil ein Thread nach jedem Assemblerbefehl unterbrechen kann. Sogar ein (*i)++ könnte noch unterbrochen werden wenn's dumm läuft.

Dafür gibt's diese Lockobjekte. Parallel zu den Funktionen im Linux-Thread hat Win32 die Funktionen CreateMutex, OpenMutex, usw. Siehe MSDN.

Wenn eine Klasse obige Eigenschaften erfüllt, daß also sichergestellt ist daß kein Thread zwischendurch nur halb veränderte Werte lesen kann, dann spricht man von einer threadsicheren Klasse.

_________________
Viele Grüße
Marc++us
C++.de
CainAdams
Mitglied

Benutzerprofil
Anmeldungsdatum: 23.07.2001
Beiträge: 35
Beitrag CainAdams Mitglied 07:47:00 22.08.2001   Titel:              Zitieren

Wie ist das ganze beim Borland C++ Builder. Ich habe da nichts von Lock, Unlock gelesen. Verwendet man dort Synchronize um das ganze Threadsicher zu machen? Oder habe ich da etwas falsch verstanden?

Cain Adams

[ 22.08.2001: Beitrag editiert von: CainAdams ]
Marc++us
Administrator

Benutzerprofil
Anmeldungsdatum: 05.04.2000
Beiträge: 16966
Beitrag Marc++us Administrator 08:18:00 22.08.2001   Titel:              Zitieren

Du kannst natürlich auch auf dem Builder die normalen Win32-Funktionen dafür verwenden... CreateMutex und Konsorten.

Bei der MFC gibt es dafür die Klassen CCriticalSection und CSingleLock.

Bei der VCL TCriticalSection mit den Methoden "Enter()" und "Leave()".

_________________
Viele Grüße
Marc++us
C++.de
Christoph
Moderator

Benutzerprofil
Anmeldungsdatum: 30.04.2001
Beiträge: 5592
Beitrag Christoph Moderator 14:03:00 22.08.2001   Titel:              Zitieren

Wie kann ich denn ein Mutex einsetzen?

z.B. bei der Klasse Point:

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
1
2
3
4
5
6
7
8
9
10
11
12
13
class Point
{
public:
  void SetX(int x) {m_x = x;}
  void SetY(int y) {m_y = y;}

  int GetX() const {return m_x;}
  int GetY() const {return m_y;}

private:
  int m_x;
  int m_y;
};
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
class Point
{
public:
void SetX(int x) {m_x = x;}
void SetY(int y) {m_y = y;}

int GetX() const {return m_x;}
int GetY() const {return m_y;}

private:
int m_x;
int m_y;
};
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
class Point
{
public:
  void SetX(int x) {m_x = x;}
  void SetY(int y) {m_y = y;}

  int GetX() const {return m_x;}
  int GetY() const {return m_y;}

private:
  int m_x;
  int m_y;
};


Wie muss ich das verändern um es thread-sicher zu machen?

[ 22.08.2001: Beitrag editiert von: cd9000 ]

[ Dieser Beitrag wurde am 14.12.2001 um 23:12 Uhr von Marc++us editiert. ]

_________________
Wenn Word für Längeres geeignet wäre, würde es nicht Word, sondern Sentence, Page oder Article heißen.
Marc++us
Administrator

Benutzerprofil
Anmeldungsdatum: 05.04.2000
Beiträge: 16966
Beitrag Marc++us Administrator 15:40:00 22.08.2001   Titel:              Zitieren

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Point
{
public:
   void setXY(int x, int y)
   {
      LOCK();
      m_x = x;
      m_y = y;
      UNLOCK();
   };

   void getXY(int& x, int& y)
   {
      LOCK();
      x = m_x;
      y = m_y;
      UNLOCK();
   };
   
private:
   int m_x;
   int m_y;
};
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Point
{
public:
void setXY(int x, int y)
{
LOCK();
m_x = x;
m_y = y;
UNLOCK();
};

void getXY(int& x, int& y)
{
LOCK();
x = m_x;
y = m_y;
UNLOCK();
};

private:
int m_x;
int m_y;
};
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Point
{
public:
   void setXY(int x, int y)
   {
      LOCK();
      m_x = x;
      m_y = y;
      UNLOCK();
   };

   void getXY(int& x, int& y)
   {
      LOCK();
      x = m_x;
      y = m_y;
      UNLOCK();
   };
   
private:
   int m_x;
   int m_y;
};


Ich habe jetzt mal allgemein LOCK/UNLOCK geschrieben, das muß man nun noch entsprechend anpassen... bei dem Linuxthread siehst Du wiederum dazu die Details, wo welche Methode eingebunden werden muß.

Wenn Du weiterhin setX/setY getrennt haben willst, mußt Du dem Benutzer die Möglichkeit eines Lock/Unlock geben (also public-Members dafür anbieten). Davon rate ich aber eher ab, weil er das zu leicht vergiesst. Also alle Parameter zusammenpacken und gemeinsam intern dann zuweisen.

_________________
Viele Grüße
Marc++us
C++.de
cd9000
Unregistrierter




Beitrag cd9000 Unregistrierter 09:40:00 23.08.2001   Titel:              Zitieren

Ich meinte eigentlich welche Funktionen ich einsetzen muss. Ich hab das halt noch nie gemacht und aus der MSDN werd ich nicht schlau.
SG1
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.03.2001
Beiträge: 2409
Beitrag SG1 Mitglied 13:11:00 23.08.2001   Titel:              Zitieren

Als erstes musst Du den Mutex mit CreateMutex erstellen. Willst Du den Mutex über mehrere Prozesse hinweg verwenden, kannst Du Dir in den anderen Prozessen das Handle über OpenMutex (oder wieder CreateMutex) holen.
Marc++s LOCK entspricht WaitForSingleObject, UNLOCK entspricht ReleaseMutex.
Und am Ende aufräumen mit CloseHandle
dynamix
Unregistrierter




Beitrag dynamix Unregistrierter 13:46:00 23.08.2001   Titel:              Zitieren

solltest du keine Prozess übergreifende Variante brauchen, solltest du lieber eine Critical Section nehmen .. ( Perfomance )..
"LOCK()" und "UNLOCK()" könntest du .. solltest du faul sein [img]images/smiles/icon_wink.gif[/img] in eine Klasse ( CLock?!? )packen ( LOCK in den Konstruktor und UNLOCK in den Destructor ).. dann brauchst du nur noch folgendes schreiben
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
1
2
3
4
5
6
7
8
9
10
11
class Point
{
public:
   void setXY(int x, int y)
   {
      CLock lock;
      m_x = x;
      m_y = y;
   };
 // ... rest hier
};
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
class Point
{
public:
void setXY(int x, int y)
{
CLock lock;
m_x = x;
m_y = y;
};
// ... rest hier
};
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
class Point
{
public:
   void setXY(int x, int y)
   {
      CLock lock;
      m_x = x;
      m_y = y;
   };
 // ... rest hier
};

.. damit vermeidest du auch das du "ausversehen" das Unlock vergisst.
( in der MSDN brauchst du nur mal nach Critical Section oder. Mutex suchen .. es gibt sogar Bsp Code , wenn du aus der Beschreibung nicht schlau wirst )
C/C++ Forum :: FAQ - WinAPI ::  "Thread-sicher"   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können keine Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum nicht antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.