[英]“new” operator in multiple threads causes Segmentation Fault
這與我在這里和這里討論的一個問題有關,但是由於我的調查使我遠離STL作為潛在的問題,而作為我的nemisis的“新”,我認為最好開始一個新的線程。
重申一下,我使用的是嵌入式平台供應商提供的arm-linux交叉編譯器(版本2.95.2)。
當我在Linux PC上運行下面的應用程序時,它當然永遠不會失敗。 但是,當在嵌入式設備上運行時,每次都會出現分段錯誤。 使用“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庫 ,它提供了可以幫助您的互斥類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.