我尝试使用ltalloc构建应用程序。我用MinGW32 4.9.1和MinGW64-32 4.9.2尝试过。
它可以编译和链接,但是当我运行它时,会出现分段错误。调试将问题定位到以下代码:

#include <pthread.h>
#pragma weak pthread_once
#pragma weak pthread_key_create
#pragma weak pthread_setspecific
static pthread_key_t pthread_key;
static pthread_once_t init_once = PTHREAD_ONCE_INIT;
static void init_pthread_key() { pthread_key_create(&pthread_key, release_thread_cache); }
static thread_local int thread_initialized = 0;
static void init_pthread_destructor()//must be called only when some block placed into a thread cache's free list
{
    if (unlikely(!thread_initialized))
    {
        thread_initialized = 1;
        if (pthread_once)
        {
            pthread_once(&init_once, init_pthread_key);  // <--- THIS CAUSES THE SEGSEGV
            pthread_setspecific(pthread_key, (void*)1);//set nonzero value to force calling of release_thread_cache() on thread terminate
        }
    }
}


据我所知,这两个版本都本地支持线程本地存储。 ltalloc的Wiki也写了以下内容:


  警告:在某些MinGW版本中,线程析构函数的emutls和执行顺序(所有线程局部变量在其之前被析构)存在问题,任何线程的终止都将导致应用程序崩溃。


不幸的是,这个警告没有告诉我任何事情。谷歌搜索还没有使我变得更聪明。

最佳答案

突如其来,试试这个:

static void init_pthread_key(void)
{
  if (pthread_key_create)
  {
    pthread_key_create(&pthread_key, release_thread_cache);
  }
}




此外,向pthread_*添加完整的错误检查可能不仅在调试期间有所帮助。

08-16 21:37