Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

24.02.2009, 17:20

[Erledigt] Frage zu Critical Sections

Ich habe mir gestern das Kapitel zu Multithreading durchgelesen da ich versuche eine vernünftige Netzwerkklasse zu schreiben. In dem Buch ist eine schöne Abbildung, in der ein kritischer Bereich als Käfig dargestellt wird, in dem Daten sind und zu dem immer nur ein Thread den Schlüssel hat. Jetzt frage ich mich wie ich definieren kann welche Daten in den Käfig kommen und welche nicht. Werden alle globalen Variablen in den Käfig gesteckt oder wie läuft das?

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

2

24.02.2009, 17:24

Das musst du schon mehr oder weniger selbst machen. C++ hindert dich nicht daran aus einem anderen Thread ohne "den Schlüssel" darauf zuzugreifen.

Also solltest du entweder Klassen nutzen in denen du mittels private/protected die Daten vor Zugriffen vor außen sicherst, oder du musst bei jedem Zugriff auf diese Daten den kritischen Bereich prüfen (Also z.B. die Mutex locken).

3

24.02.2009, 17:34

dumme frage, aber wie mache ich das denn selber?
Ich glaube ich habs gerade verstanden, die critical section hat überhaupt nicht mit den Daten selber zu tun. Sie ist quasi einfach dafür zuständig das die threads einen bestimmten code abschnitt nicht gleichzeitig ausführen können. Stimmt das so?

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

24.02.2009, 17:43

Noch nicht mal das. CriticalSections können dafür sorgen, dass ein bestimmter Thread solange wartet, bis er dran ist. Sie können auch dazu genutzt werden um festzustellen, ob gerade ein Thread etwas bestimmtes bearbeitet. Aber CriticalSections sind von Grund auf weder von Code noch von Daten abhängig. Man kann sie aber so nutzen:

C-/C++-Quelltext

1
2
3
4
5
6
void Klasse::methode_die_von_mehreren_threads_aufgerufen_wird(void)
{
 cs.lock();
//hier kann immer nur einer der aufrufenden threads sein

 cs.unlock();
}

Somit kann man z.B. das Schreiben einer Variablen absichern, indem man dafür sorgt, dass nur innerhalb dieser Methode geschrieben wird.

EDIT: man kann aber auch locks durchaus über den Code verteile, was unübersichtlich ist, ggf. vielleicht auch notwendig. Dann sicher die CS nicht mehr einen bestimmten Bereich ab, sondern z.B. bestimmte Zugriffe.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

5

24.02.2009, 17:55

vielen dank, ich habe jetzt verstanden wie ich die critical sections benutzen muss :)

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

6

24.02.2009, 18:04

Übrigens: Threading allein ist schon böse. Netzwerk noch böser. Aber Threading + Netzwerk ist echt übel. Wenn du nicht auf Enttäuschungen, stundenlanges Debugen und Schmerzen stehst, rate ich dir von dem Thema ab und dazu eine fertig Lib zu nutzen. Auch da wirst du dich noch mit genug Problemen rumschlagen müssen, aber zumindest die Grundlagen sind dann (hoffentlich) schonmal fehlerfrei.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

7

24.02.2009, 21:16

da hast du wahrscheinlich recht, aber ich versuche eine sehr simple klasse zu schreiben mit geringem funktionsumfang.

Ich hab direkt mal das erste Problem. Die Funktion die ich CreatThread übergebe ist eine public Funktion einer Klasse. Der Thread wird innerhalb einer anderen Funktion dieser Klasse gestartet.

Die Klasse sieht bis jetzt so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
class CServer
{
    public:
    
        CServer();
        void Init(int port, int max_client_count);
        DWORD WINAPI WaitForConnections(LPVOID pParameters);

...


und der Funktionaufrauf:

C-/C++-Quelltext

1
hWaitForConnections = CreateThread(NULL, 0, WaitForConnections, NULL, 0, &dwWaitForConnections);



Jetzt bekomme ich folgenden Fehler:

Quellcode

1
error C3867: "CServer::WaitForConnections": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&CServer::WaitForConnections", um einen Zeiger auf den Member zu erstellen.



Wenn ich einen Thread mit einer Funktion außerhalb der Klasse starte funktionert alles wunderbar. Wisst ihr wie ich den Thread richtig aufrufen muss?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

8

24.02.2009, 21:35

Mach einfach eine statische Funktion in der Klasse, die du angeben kannst und dann über den Parameter "lpParameter" die Instanz der Klasse, die du möchtest. Das ist schlussendlich ja auch das Prinzip, wie Memberfunktionen arbeiten. Nur halt implizit..

Beneroth

Alter Hase

Beiträge: 969

Wohnort: Schweiz

Beruf: Software Entwickler

  • Private Nachricht senden

9

25.02.2009, 09:57

Zitat von »"Nox"«

Übrigens: Threading allein ist schon böse. Netzwerk noch böser. Aber Threading + Netzwerk ist echt übel. Wenn du nicht auf Enttäuschungen, stundenlanges Debugen und Schmerzen stehst, rate ich dir von dem Thema ab und dazu eine fertig Lib zu nutzen. Auch da wirst du dich noch mit genug Problemen rumschlagen müssen, aber zumindest die Grundlagen sind dann (hoffentlich) schonmal fehlerfrei.


Profiler, Sniffer und Telnet ftw.

Und Netzwerk + Threading macht Spass wenn es funktioniert und die bits tanzen! :D

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

10

25.02.2009, 13:01

wenn es denn funktioniert. Atm jage ich wieder einen Bug, der bei jemand anderes immer auftritt und bei mir nie....
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Werbeanzeige