Soalan:
Bolehkah berbilang rangkaian serentak memanggil push_back () kaedah pada objek std::vektor kongsi tanpa menjejaskan keselamatan benang? Atau, adakah pengguna perlu melaksanakan mekanisme penyegerakan tambahan?
Jawapan:
Bertentangan dengan andaian popular, kedua-dua vektor C standard (std::vector) dan Vektor Boost (boost::vector) menyediakan jaminan keselamatan benang terhad mengikut C standard.
Jaminan Keselamatan Benang:
Jaminan ini mungkin tidak sejajar dengan jangkaan tipikal untuk keselamatan benang, tetapi ia wajar mengambil kira reka bentuk bekas standard, yang mengutamakan capaian cekap dalam senario benang tunggal. Menggabungkan mekanisme penguncian ke dalam kaedah mereka akan menghalang kecekapan ini.
Penguncian Luaran:
Untuk memastikan keselamatan benang penuh apabila berbilang benang mengakses bekas secara serentak, mekanisme penyegerakan luaran mesti dilaksanakan . Keperluan khusus digariskan dalam bahagian 17.6.4.10 [res.on.objects] perenggan 1 standard C.
Tingkatkan Pertimbangan Vektor:
Jaminan keselamatan benang untuk vektor Boost dijangka sama dengan vektor standard, memandangkan antara muka yang serupa. Walau bagaimanapun, penguncian luaran masih diperlukan untuk menjamin akses serentak yang selamat.
Kesimpulan:
Walaupun vektor standard C dan Boost menyediakan jaminan keselamatan benang tertentu, ia adalah terhad. Untuk keselamatan benang lengkap dalam senario berbilang benang, mekanisme penyegerakan luaran mesti digunakan untuk mengelakkan perlumbaan data.
Atas ialah kandungan terperinci Adakah Standard C dan Boost Vectors Thread-Selamat untuk Operasi `push_back()` Serentak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!