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

idontknow

unregistriert

1

17.04.2010, 10:45

[WinAPI] Thread und Fiber

HI!

Ich versuche mich gerade in Threads unter Windows einzuarbeiten sprich alles ohne irgendwelche Bibliotheken zu machen wäre ja schwachsinn da ichs selber verstehen möchte ^^

Jetzt habe ich natürlich etwas gegoogled und hab paar Informationen gefunden bei denen ich nicht alles wirklich verstehe sprich habn Problem mit dem Verständnis zwischen Fiber und Thread!

Kurz zu Fiber: Laut Wikipedia (http://de.wikipedia.org/wiki/User_Thread#Windows) werden Threads unter Windows "Fiber" z.D. Faser genannt.

Das problem ist jetzt dass ich 2 Funktionen habe in der WinAPI
1) CreateFiber (http://msdn.microsoft.com/en-us/library/…v=VS.85%29.aspx)
2) CreateThread(http://msdn.microsoft.com/en-us/library/…28VS.85%29.aspx)

was aber beides Threads sein sollen.

Jetzt bin ich mir da unsicher wo der Unterschied ist! Rein vom logischen her hätte ich gesagt dass ein Fiber ein Thread innerhalb meines aktuellen Threads ist und quasi mit ihm verbunden, sprich schließe ich den Parent Thread werden auch alle Child-Threads geclosed. Analog dazu wäre nen "wirklicher" Thread ein Thread unabhängig vom aktuellen Prozess ein Fiber aber mit dem aktuellen Prozess verbunden.
Außerdem kann ich bei Fiber keine Securit Attribute angeben, wodurch ich davon ausgehe dass dort die SA des Prozesses genommen werden was meine Theorie bestätigt^^

Aber könnte natürlich auch alles falsch sein, daher Auflößung von den Profis pls ;)

Dankeschön :=) Schönes Wochenende noch :D

2

17.04.2010, 10:50

Kenne mich mit dem Thema auch noch nicht so gut aus, aber habe einen ganz guten Beitrag dazu gefunden denke ich mal:

http://cboard.cprogramming.com/windows-p…eatethread.html (3.Beitrag)
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

idontknow

unregistriert

3

17.04.2010, 10:58

Process
|
+--Thread1
|
+ Fiber1
+Fiber2
+Fiber3
+Fiber4
+--Thread2
[No fibers]


Wuerde meine Theorie bestätigen, sprich Nen Thread istn Parentthread von nem Fiber^^
das würde heißen schließe ich nen Thread werden alle seine Child Fibers geschlossen die mit ihm assoziiert sind.
Die Frage is halt ob das stimmt ^^
Und steckt sicher noch mehr dahinter^^

4

17.04.2010, 11:04

Also auf der Seite von Microsoft steht, dass wenn ein Fiber ExitThread aufruft, der zugehörige Thread geschlossen wird.

http://msdn.microsoft.com/en-us/library/…v=VS.85%29.aspx

Das würde für mich eigentlich bedeuten, dass alles sauber geschlossen wird mit ExitThread. Vielleicht kann das ja nochmal jemand bestätigen, der sich damit auskennt.
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

idontknow

unregistriert

5

17.04.2010, 11:05

dot sagt Fibers willich nich also will ich Threads^^

Hat sich damit erledigt ist irgendwas böhses was man selber managen muss oder so kA

bepo

Frischling

Beiträge: 33

Wohnort: Bayern

Beruf: Schüler

  • Private Nachricht senden

6

17.04.2010, 21:08

Ein Fiber ist 'Lightweight'-Thread. Bei Threads übernimmt das Betriebssystem das Scheduling, bei Fibers hingegen der Benutzer. Wird z.B.aus Dateien gelesen (ReadFile(...)) oder auf einem Mutex (WaitForSingleObject(...)) gewartet, wechselt das Betriebssystem den Thread. Dieser Wechsel vom User- in den Kernel- Space und anschließend zurück sowie einen Thread-Context-Switch sind relativ teuer und außerdem gibt der Thread seine verbleibende Rechenzeit ab.

Kurz gesagt: Ein Fiber ist so etwas wie ein Thread im Thread. Anstatt den Thread nun zu blockieren, bis dieser weiterlaufen kann, kann der Benutzer dem Thread eine neue Fiber zuweisen, welche von an nun auf diesem weiterläuft und bei Gelegenheit wieder zur urspünglichen Fiber zurückspringt (z.B. mittels asynchronem IO und eigenem Mutex, was einen eigenen Fiber-Scheduler voraussetzt).

Es gibt eine Fiber-Pool-Bibliothek welche solch einen Scheduler implementiert und bestimmte Anwendungen wie Dateikomprimierung (+30%) oder mp3-Codierung (+100%) durch bessere Prozessor- und Speicherauslastung sowie Userspacescheduling nicht ganz unerheblich beschleunigt.

Ein Fiber-Switch ist sehr günstig, da ausschließlich die aktuellen Register gesichert werden und dann der Stackpointer (esp-Register) gewechselt wird und die Register des Fibers wiederhergestellt werden. Der Cache ist wie beim Thread-Context-Switch allerdings nicht mehr warm.

Hierzu eine experimentelle boost-library:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#define BOOST_COROUTINE_swapcontext(name) \
asm volatile (                          \
".text \n\t"                            \
".global " #name "\n\t"                 \
".type " #name "@function\n\t"          \
".align 16\n\t"                         \
#name":\n\t"                            \
"movl  16(%edx), %ecx\n\t"              \
"pushl %ebp\n\t"                        \
"pushl %ebx\n\t"                        \
"pushl %esi\n\t"                        \
"pushl %edi\n\t"                        \
"movl  %esp, (%eax)\n\t"                \
"movl  %edx, %esp\n\r"                  \
"popl  %edi\n\t"                        \
"popl  %esi\n\t"                        \
"popl  %ebx\n\t"                        \
"popl  %ebp\n\t"                        \
"add   $4, %esp\n\t"                    \
"jmp   *%ecx\n\t"                       \
"ud2\n\t")                              \
/**/

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »bepo« (17.04.2010, 21:14)


Werbeanzeige