簡體   English   中英

多個線程中的“new”運算符會導致Segmentation Fault

[英]“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庫 ,它提供了可以幫助您的互斥類型。

如何使用malloc(你說在嵌入式平台上永遠不會失敗)來獲取所需的內存然后使用placement new(void * operator new [](std :: size_t size,void * ptr)throw())假設它是可用的,用於施工。 請參閱new []運算符

請參閱stackoverflow文章

MSDN

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM