多个线程中的“新”运算符会导致分段错误

这与我在这里和这里讨论的一个问题有关,但是由于我的调查已经把我从STL当作潜在的问题,而把“新”当作我的nemisis,所以我认为最好是开始一个新的话题。

重申一下,我正在使用由embedded式平台供应商提供的arm-linux交叉编译器(版本2.95.2)。

当我在Linux PC上运行下面的应用程序时,它当然不会失败。 但是,在embedded式设备上运行时,每次都会出现分段错误。 使用“malloc”永远不会失败。 同步使用互斥“新”分配将停止问题,但这是不实际的在我的主要应用程序。

任何人都可以提出为什么这可能会发生,或有任何想法,我可以解决这个问题?

谢谢。

#include <stdio.h> #include <pthread.h> pthread_mutex_t _logLock = PTHREAD_MUTEX_INITIALIZER; static void* Thread(void *arg) { int i = 0; while (i++ < 500) { // pthread_mutex_lock(&_logLock); char* myDyn = (char*) new char[1023]; // char* buffer = (char*) malloc(1023); // if (buffer == NULL) // printf("Out of mem\n"); // free(buffer); delete[] myDyn; //pthread_mutex_unlock(&_logLock); } pthread_exit(NULL); } int main(int argc, char** argv) { int threads = 50; pthread_t _rx_thread[threads]; for (int i = 0; i < threads; i++) { printf("Start Thread: %i\n", i); pthread_create(&_rx_thread[i], NULL, Thread, NULL); } for (int i = 0; i < threads; i++) { pthread_join(_rx_thread[i], NULL); printf("End Thread: %i\n", i); } } 

如果您的设备上的堆不是线程安全的,那么您需要锁定。 你可以编写自己的新的和删除的函数来锁定新的或删除的时间 – 你不需要在分配的内存的整个生命周期内保持锁定。

检查是否有编译器开关使分配器线程安全。

正如其他人所说,机会的是,工具集的默认内存分配行为是不是线程安全的。 我刚刚检查了我使用最多的2个ARM交叉开发工具集,其中一个就是这样。

大多数工具集都提供了通过重新实现函数或链接库的不同(线程安全)版本来使库变得线程安全的方法。 如果没有更多的信息,很难说你的特定工具正在做什么。

讨厌这样说,但最好的信息可能在你的工具集文档中。

是的, new的可能不是线程安全的。 内存分配需要同步机制,并且需要单独在删除周围进行。 看看Boost.thread库 ,它提供了应该帮助你的互斥体类型。

如果使用malloc(你说它永远不会在嵌入式平台上失败),以获得所需的内存,然后使用位置new(void * operator new [](std :: size_t size,void * ptr)throw())假设它是可用的,为建设。 看到新的[]运营商

另请参阅stackoverflow文章

和MSDN