Melaksanakan Singleton Multithreaded dalam C 11 Tanpa Mutexes
Dengan pengenalan keupayaan multithreading dalam C 11, persoalan timbul tentang bagaimana untuk melaksanakan singleton tanpa menggunakan mutex untuk pengoptimuman prestasi. Pendekatan yang dicadangkan melibatkan penggunaan pembolehubah atom dan fungsi std::atomic_compare_exchange_strong():
<code class="cpp">class Singleton { public: static bool isInitialized() { return (flag == 2); } static bool initizalize(const string& name_) { if (flag == 2) return false; if (flag == 1) return false; int exp = 0; int desr = 1; bool willInitialize = std::atomic_compare_exchange_strong(&flag, &exp, desr); if (!willInitialize) { cout << "Somebody else CASed at aprox same time" << endl; return false; } else { initialize_impl(name_); assert(flag == 1); flag = 2; return true; } } static void clear() { name.clear(); flag = 0; } private: static void initialize_impl(const string& name_) { name = name_; } static atomic<int> flag; static string name; };</code>
Pembolehubah atom dan fungsi std::atomic_compare_exchange_strong() memastikan keselamatan benang tanpa memperkenalkan penyegerakan di atas kepala. Walau bagaimanapun, pendekatan ini masih memerlukan pengendalian yang berhati-hati untuk mengelakkan perlumbaan data dan memastikan permulaan yang betul.
Piawaian C 11 Menguatkuasakan Keselamatan Permulaan
Menariknya, piawaian C 11 menghapuskan keperluan untuk penguncian manual dalam senario tertentu. Coretan kod berikut memanfaatkan gelagat ini:
<code class="cpp">static Singleton& get() { static Singleton instance; return instance; }</code>
Perlaksanaan serentak yang cuba memulakan tika pembolehubah statik secara tersirat akan menunggu siapnya, mengurangkan kemungkinan keadaan perlumbaan.
Singleton Anti- Corak
Walaupun pendekatan di atas menyediakan penyelesaian untuk pelaksanaan singleton berbilang benang, perlu diingat bahawa penggunaan singleton secara amnya tidak digalakkan. Mereka boleh memperkenalkan gandingan, kebergantungan keadaan, dan merumitkan ujian unit. Corak reka bentuk alternatif selalunya lebih disukai untuk mengurus sumber dan kebergantungan yang dikongsi.
Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Singleton Berbilang Benang dalam C 11 Tanpa Mutexes?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!