MinGW und Multithreading
-
Hallo,
folgender Code:
int icy_play::myMemberCallback (const void *input, void *output, unsigned long frameCount, const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags) { size_t need = 4608; got = 0; out = static_cast <unsigned char*> (output); while (need > 0) { got_now = 0; ret = mpg123_decode (mpg, NULL, 0, out+got, need, &got_now); got += got_now; need -= got_now; if (ret == MPG123_NEED_MORE) { int empf = 0; do { int aktuell = recv (Socket, in + empf, in_size - empf, 0); aktuell >= 0 ? empf += aktuell : throw std::runtime_error ("Verbindung unterbrochen"); } while (empf < in_size); ret = mpg123_decode (mpg, in, in_size, NULL, 0, NULL); } if (ret == MPG123_ERR) throw std::runtime_error ("Decoding error"); } return paContinue; }
. Dies ist eine Callback Funktion von Portaudio und wird in einem, von Portaudio erzeugten, eigenen Thread ausgeführt. Dies funktioniert unter Linux einwandfrei, jedoch kommt es unter Windows zu einem Programmabsturz sobald Zeile 7 durchlaufen wird. Der gdb gibt folgendes als Ursache zurück:
Program received signal SIGSEGV, Segmentation fault # 0 0x77c17032 in msvcrt!memcpy ()from C:\Windows\system32\msvcrt.dll #1 0x66242bf1 in pango_direction_get_type () from C:\msys\1.0\home\Basti\Stream\libmpg123-0.dll
Für mich sieht das so aus, als hätte die memcpy Implementierung in der msvcrt DLL ein Problem mit Multithreading. Ich halte dies jedoch für recht unwahrscheinlich, da diese DLL doch in nahezu jedem Windowsprogramm Verwendung findet und mit diesen Techniken doch eigentlich klar kommen müsste.
Nochmal kurz zusammengefasst: Das Programm funktioniert unter Linux einwandfrei. Die oben gezeigt Funktion wird in einem separaten, von Portaudio erzeugten Thread ausgeführt. Das mpg123_handle wird im Konstruktor der icy_stream Klasse erzeugt. Dies geschieht im Hauptthread des Programms und funktioniert einwandfrei. Nachdem der separate Thread gestartet wurde und die Decoding Funktion aufgerufen wird (die vermutlich auf memcpy () zurückgreift) kommt es zu besagtem Absturz.Kann dies mit der msvcrt Implementierung zusammenhängen oder bin ich da auf der völlig falschen Fährte?
Danke für die Hilfe
-
mit mingw sollte man für multithreading sowohl beim kompiliervorgang, als auch beim linkvorgang die option -mthreads verwenden.
<a href= schrieb:
gcc manual">-mthreads
Support thread-safe exception handling on `Mingw32'. Code that relies on thread-safe exception handling must compile and link all code with the -mthreads option. When compiling, -mthreads defines -D_MT; when linking, it links in a special thread helper library -lmingwthrd which cleans up per thread exception handling data.hast du das beachtet?