Win32-mingwでのスレッドのスタックについて

VP8,VP9を使うためのライブラリlibvpxhttps://www.webmproject.org/code/での動画の変換がうまくいったのでスレッド化してみたところ、なぜかSIGSEGVで落ちるようになってしまったので調査。

■前提:
MinGWPosixスレッドを選択してインストール済み

■テストコード

#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に変更してみることに・・・。