( Kiskübi | 2021. 03. 22., h – 22:48 )

> Asszem, rossz kódblokkokat néztél, mert ezekben szó nem volt az unsafe-ról

Jó kódblokkot néztem, mint az a szövegből is kiderül.  Az unsafe-et csak hangsúlynak tettem hozzá, hogy még az sem érvényteleníti azt a szabályt, miszerint nem kapod meg az adatot, csak ellenőrzés után.

> Egy több magon futó, többthread-es, közös bufferen dolgozó kódban hogy gátolja meg a Rust a data race condition-t úgy, hogy ne nyírja ki az egészet?

  • Szál csak Sync típusú adatra vehet át referenciát.
  • Sync típusú a csak olvasható adat, a Mutex<T> és RwLock<T>, és az atomi műveleteket használó típusok.  De csinálhatsz magadnak egyéb szinkronizációs módszert, ha van ötleted még (lehet).  unsafe-fel természetesen.
  • A Mutexből és RwLock-ból - az Option<T>-hez egészen hasonlóan - nem tudod kivenni az adatot, kizárólag a lock() (Mutex esetén), illetve read() és write() (RwLock esetén) hívás ad rá referenciát.  Ami ráadásul nem is egészen nyers referencia, hanem Guard, ami azt jelenti, hogy kódblokkból kilépéskor elengedi a zárolást.  Ne aggódj, attól még ugyanolyan gyors, mint egy pointer, a standard lib inline deref() metódusokat szokott ilyen helyeken használni.

Hát így.