Hi,
XAudio2 verlangt von mir, dass ich CoInitializeEx() aufrufe. Dabei stehen mir verschiedene COINIT-Konstanten zur Verfügung, die ich übergeben kann/soll/muss – und ich weiß nicht, wie ich mich entscheiden soll (bei Direct3D ist man vor sowas ja wohlbehütet).
Wenn ich das richtig verstehe, sorgt COINIT_APARTMENTTHREADED dafür, dass alle Aufrufe aus verschiedenen Threads synchronisiert und seriell durch meinen Haupt-Thread verarbeitet werden. COINIT_MULTITHREADED schmeißt das alles weg und die Objekte haben selber dafür zu sorgen, dass sie bei Nebenläufigkeit nicht auf die Nase fallen. Ist damit der interne Text der COM-Objekte gemeint, oder meiner? D.h., muss ich dann die Synchronisierung selber übernehmen oder macht das die Bibliothek für mich?
Gruß, Ky
CoInitializeEx()
- Sternmull
- Establishment
- Beiträge: 264
- Registriert: 27.04.2007, 00:30
- Echter Name: Til
- Wohnort: Dresden
Re: CoInitializeEx()
Ich würd sagen deine Vorstellung von Apartment/Multi-Threaded ist korrekt. Laut Doku von CoInitializeEx gilt diese Entscheidung für alle COM-Objekte die von diesem Thread erstellt werden.
Wer da jetzt synchronisieren muss, und ob das überhaupt notwendig ist, hängt vom konkreten Fall ab. z.B. könntest du ein COM-Objekt (und alles was mit ihm interagiert) grundsätzlich immer aus einem einzigen deiner Threads aufrufen (z.B. einfach dem Main-Thread). Dann bräuchte sich keiner Sorgen um die Synchronisation machen. Vielleicht gibt es aber auch COM-Intefaces bei denen dokumentiert ist das sie sich selber synchronisieren müssen.
Gefährlich wirds wenn ein COM-Interface bzw. eine Methode davon nicht threadsicher ist (bzw. garnicht dokumentiert ist ob das Teil nun threadsafe ist... das dürfte die Regel sein). In dem Fall musst du sicherstellen das nicht mehrere Threads auf einmal drauf zugreifen.
In der Doku zu XAudio2Create wird "CoInitializeEx(NULL, COINIT_MULTITHREADED);" als typisches Beispiel genannt. Wenn du dich nicht entscheiden kannst solltest du das vielleicht einfach auch so machen :)
Wer da jetzt synchronisieren muss, und ob das überhaupt notwendig ist, hängt vom konkreten Fall ab. z.B. könntest du ein COM-Objekt (und alles was mit ihm interagiert) grundsätzlich immer aus einem einzigen deiner Threads aufrufen (z.B. einfach dem Main-Thread). Dann bräuchte sich keiner Sorgen um die Synchronisation machen. Vielleicht gibt es aber auch COM-Intefaces bei denen dokumentiert ist das sie sich selber synchronisieren müssen.
Gefährlich wirds wenn ein COM-Interface bzw. eine Methode davon nicht threadsicher ist (bzw. garnicht dokumentiert ist ob das Teil nun threadsafe ist... das dürfte die Regel sein). In dem Fall musst du sicherstellen das nicht mehrere Threads auf einmal drauf zugreifen.
In der Doku zu XAudio2Create wird "CoInitializeEx(NULL, COINIT_MULTITHREADED);" als typisches Beispiel genannt. Wenn du dich nicht entscheiden kannst solltest du das vielleicht einfach auch so machen :)
- Krishty
- Establishment
- Beiträge: 8350
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: CoInitializeEx()
Dankeschön … dann werde ich auch COINIT_MULTITHREADED benutzen. Gegebenenfalls prüfe ich später nochmal, welchen Modus Direct3D 11 setzt.