Linux çekirdeği geliştiricileri için eşzamanlı veri erişimiyle uğraşırken READ_ONCE() ve WRITE_ONCE() makrolarını anlamak kritik öneme sahiptir. Bu makrolar, derleyicinin okuma ve yazma işlemlerini birleştirmesini veya yeniden getirmesini engelleyerek, okuma veya yazmanın tam olarak bir kez gerçekleşmesini sağlar. Ayrıca, bir görevin READ_ONCE() ile bir konumu okurken başka bir görevin o konuma yazması durumunda, okumanın yazmadan önceki veya sonraki değeri döndürmesini, rastgele bir kombinasyon olmamasını garanti ederek atomik erişim sağlarlar. Bu makrolar, derleyici veya CPU üzerinde başka bir sıralama kısıtlaması getirmez ve 2014 yılında 3.18 sürümüyle çekirdeğe eklenmiştir.
Alice Ryhl, Rust için READ_ONCE() ve WRITE_ONCE() uygulamalarını ekleyen bir yama serisi yayınladı. Ryhl, bu çağrıların volatile okumaların yerini alabileceği yerler olduğunu belirtti ve yama serisi, struct file'ın f_flags alanına erişimi READ_ONCE() kullanacak şekilde değiştirdi. Bu makroların Rust'taki uygulaması, read_volatile() ve write_volatile() fonksiyonlarına yapılan çağrılara dayanmaktadır.
Ancak, diğer bazı çekirdek Rust geliştiricileri bu değişikliğe itiraz etti. Gary Guo, READ_ONCE() ve WRITE_ONCE()'ı doğrudan açığa çıkarmak yerine Rust'ın Atomic crate'indeki relaxed işlemleri kullanmayı önerdi. Boqun Feng ise READ_ONCE() ve WRITE_ONCE()'ın anlamsal karmaşıklığına dikkat çekerek, bazen atomiklik, bazen de veri yarışlarını önlemek için kullanıldıklarını belirtti. Feng, Rust'ta da Linux çekirdeği bellek modelini (LKMM) kullandıklarını, ancak mümkün olduğunca API'nin amacını Atomic::from_ptr().load(Relaxed...) gibi ifadelerle netleştirmeleri gerektiğini savundu. Bu tartışma, çekirdek geliştirme süreçlerinde bellek modellemesi ve eşzamanlılık kontrollerinin önemini vurgulamaktadır.
Linux çekirdeğinde Rust kullanımının yaygınlaşmasıyla birlikte, düşük seviyeli bellek erişim ve eşzamanlılık kontrol mekanizmalarının Rust'a nasıl entegre edileceği konusunda önemli tartışmalar yaşanıyor.