2016-10-18 42 views
2

我在其中一個類中重新實現了新/刪除操作符。現在我正在使我的代碼成爲多線程的,並且希望瞭解這些運算符是否也需要成爲線程安全的。我已經閱讀過某些地方,Visual Studio中的默認new/delete操作符是線程安全的。但是它適用於我的類的自定義新/刪除操作符嗎?如果有多個執行線程使用C++中類級別新刪除操作符的線程安全性

void* MyClass::operator new(std::size_t count) 
{ 
    void* memo = ::operator new(count); 
    printf("Allocated base\n"); 
    return memo; 
} 
+1

這取決於你的'new' /'delete'實現。如果您只是在您的示例中調用標準運算符,則它已經是線程安全的。如果您創建自己的內存管理器,則必須確保它在多線程環境中正常工作。 – Ari0nhh

+0

對於Unix,對於分叉和線程,我們必須始終考慮[this](http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them)。 – UKMonkey

回答

2

你自己new操作者必須是線程安全的。

如果您自己的new運算符僅調用其他線程安全函數,並且不會執行任何會引起執行併發衝突的任何操作,那麼就沒有任何操作,您的new運算符在默認情況下是線程安全的。

因此,對於您的操作員,您需要分析每個函數調用及其代碼的每一行,以確定是否存在必須明確解決的併發問題。這與編寫其他必須在多個執行線程中正確工作的東西沒有什麼不同,所以new運算符在涉及到線程安全性時並不真正引入任何特殊要求,僅僅因爲它是new運算符。