new
dan delete
aman untuk thread
Fungsi-fungsi berikut diperlukan agar thread-safe:
- Versi pustaka
operator new
danoperator delete
- Versi penggantian pengguna untuk
operator new
global danoperator delete
std::calloc
,std::malloc
,std::realloc
,std::aligned_alloc
,std::free
Pemanggilan ke fungsi ini yang mengalokasikan atau membatalkan alokasi unit penyimpanan tertentu terjadi dalam urutan total tunggal, dan setiap panggilan pembatalan alokasi tersebut terjadi-sebelum alokasi berikutnya (jika ada) dalam urutan ini.
Dengan gcc, new
diimplementasikan dengan mendelegasikan ke malloc
, dan kita melihat bahwa malloc
mereka memang menggunakan kunci. Jika Anda khawatir alokasi Anda menyebabkan kemacetan, tulis alokasi Anda sendiri.
Jawabannya ya, tapi dalam praktiknya biasanya bukan masalah. Jika ini masalah bagi Anda, Anda dapat mencoba mengganti implementasi malloc Anda dengan tcmalloc yang mengurangi, tetapi tidak menghilangkan kemungkinan pertikaian (karena hanya ada 1 heap yang perlu dibagi di antara utas dan proses).
TCMalloc menetapkan setiap utas sebuah cache lokal-utas. Alokasi kecil dipenuhi dari cache thread-local. Objek dipindahkan dari struktur data pusat ke cache thread-local sesuai kebutuhan, dan pengumpulan sampah berkala digunakan untuk memigrasikan kembali memori dari cache thread-local ke struktur data pusat.
Ada juga opsi lain seperti menggunakan pengalokasi khusus dan/atau wadah khusus dan/atau mendesain ulang aplikasi Anda.