2016-10-18 5 views
2

新しいクラスのいずれかで新しい/削除演算子を再実装しました。今私は自分のコードをマルチスレッド化しており、これらの演算子がスレッドセーフである必要があるかどうかを理解したいと思います。私は、Visual Studioのデフォルトの新規/削除演算子がスレッドセーフであることをどこかで読んだことがあります。しかし、それは私のクラスのカスタム新規/削除演算子に当てはまりますか?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-beforeusing-them)の問題を常に考慮する必要があります。 – UKMonkey

答えて

2

それは複数の実行スレッドを使用している場合は、独自のnewオペレータは、スレッドセーフでなければなりません。

newオペレータが他のスレッドセーフな関数だけを呼び出し、実行の同時実行の競合を引き起こすものがない場合、何もする必要はありません。newオペレータはデフォルトでスレッドセーフです。

オペレータにとっては、すべての関数呼び出しとそのコードのすべての行を分析して、明示的に対処しなければならない並行性の問題があるかどうかを判断する必要があります。これは実際には複数の実行スレッドで正しく動作する必要があるものを書くことと全く同じであるため、new演算子であるという理由だけで、スレッドセーフティに関しては特別な要件を実際に導入しません。

関連する問題