Win32-mingwでのスレッドのスタックについて
VP8,VP9を使うためのライブラリlibvpxhttps://www.webmproject.org/code/での動画の変換がうまくいったのでスレッド化してみたところ、なぜかSIGSEGVで落ちるようになってしまったので調査。
■前提:
MinGWをPosixスレッドを選択してインストール済み
■テストコード
#include <stdio.h> #include <pthread.h> #include <windows.h> #include <inttypes.h> void *pthreadTest(void *p) { printf("POSIX thread started.\n"); //allocate 10MB for stack and heap uint32_t tenMegaBytes = 1024*1024*10; unsigned char allocStack[tenMegaBytes]; unsigned char *allocPointer = (unsigned char*)malloc(tenMegaBytes); for(long i=0;i<tenMegaBytes;i++){ allocStack[i] = 0; *(allocPointer+i) = 0; } printf("POSIX thread finished.\n"); return 0; } DWORD WINAPI win32ThreadTest() { printf("Win32 thread started.\n"); //allocate 10MB for stack and heap uint32_t tenMegaBytes = 1024*1024*10; unsigned char allocStack[tenMegaBytes]; unsigned char *allocPointer = (unsigned char*)malloc(tenMegaBytes); for(long i=0;i<tenMegaBytes;i++){ allocStack[i] = 0; *(allocPointer+i) = 0; } printf("Win32 thread finished.\n"); return 0; } int main(void) { //POSIX pthread pthread_t pthread; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setstacksize(&attr, 1024*1024*10+1); pthread_create(&pthread, &attr, &pthreadTest, NULL); pthread_join(pthread, NULL); // pthreadで作られたスレッドが終わるまで待つ // win32 thread HANDLE handle = CreateThread(0,1024*1024*10+1,win32ThreadTest,(LPVOID)NULL,0,0); WaitForSingleObject(handle, INFINITE); CloseHandle(handle); return 0; }
win32、posixのスレッドに、それぞれスタックサイズを10MB割り振ってゼロクリアのテスト。正常終了。
スタックを10MBに変更しない場合には、デフォルトの1MBが適用され、OutOfMemory等で落ちるわけでもなく、スタック確保実行時にSIGSEGVで落ちていた。
ここではpthreadもwin32 threadも仕様通りの挙動を示しているのが、libvpxではpthread〇、win32thread×となり、すべてpthreadに変更してみることに・・・。