Poniższy kod zawiera potencjalny zakleszczenie, ale wydaje się konieczny: aby bezpiecznie skopiować dane do jednego kontenera z drugiego, oba kontenery muszą być zablokowane, aby zapobiec zmianom w innym wątku.Uzyskiwanie blokady na dwóch muteksach i unikanie zakleszczenia
void foo::copy(const foo & rhs)
{
pMutex->lock();
rhs.pMutex->lock();
// do copy
}
Foo ma kontener STL, a "wykonaj kopię" zasadniczo polega na użyciu std :: copy. Jak mogę zablokować oba muteksy bez wprowadzania impasu?
Nawet coś tak prostego jak adresy VS RHS pracowałbym. zawsze najpierw blokuj ten z niższym adresem. –
Klon działałby dobrze tylko wtedy, gdyby nie był kopiowany, i nie sądzę, że niejawne udostępnianie będzie działać, ale przyjrzę się. Interesujące podejście Kyle. Nie widzę żadnych wad. – pomeroy