Bu, taşınma ile ilgili değildir.
birden fazla parçacığı, aynı vector
ancak vector::push_back()
üzerinde vector::push_back()
yürütme evre değildir. vector
'daki değişikliklerin senkronize edilmesi gerekir.
A std::mutex
push_back()
çağrıları eşitlemek için kullanılabilir:
std::vector<int> values;
std::mutex values_mutex;
void values_push_back()
{
values_mutex.lock();
values.push_back(i);
values_mutex.unlock();
}
Ayrıca değişken i
(bu olası bir sonuçtur bir yarış durumu neden olacaktır olup senkronizasyon olmadan parçacıkları arasında paylaşılıyor int
yinelenen vector
) eklenmiştir. önlemek için konuya bir argüman olarak int
değer geçirerek düşünün:
std::vector<int> values;
std::mutex values_mutex;
void values_push_back(int i)
{
values_mutex.lock();
values.push_back(i);
values_mutex.unlock();
}
for (int i = 0; i < 10; ++i)
{
threads.push_back(std::thread(values_push_back, i));
}
for (auto& t: threads) t.join();
bamboon
push_back()
atarsa kilit serbest bırakılır sağlamak için
std::lock_guard
tercih tarafından yorumladığı gibi
(bu durumda sadece bad_alloc()
olabilir ki ama vector
değişiklikler kurucular atma var daha karmaşık nesneleri tutmak için eğer) daha önemli hale gelir:
void values_push_back(int i)
{
std::lock_guard<std::mutex> lk(values_mutex);
values.push_back(i);
}
hmjds yanıta yorumumu görmek ve bl Lütfen yapma indly kodunu kopyala. – inf