我尝试使用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_*
添加完整的错误检查可能不仅在调试期间有所帮助。