Di Objective-C Anda memiliki perbedaan antara sifat atom dan nonatomik:
@property (nonatomic, strong) NSObject *nonatomicObject;
@property (atomic, strong) NSObject *atomicObject;
Dari pemahaman saya, Anda dapat membaca dan menulis properti yang didefinisikan sebagai atom dari banyak utas dengan aman, sementara menulis dan mengakses properti nonatomik atau ivars dari beberapa utas pada saat yang sama dapat mengakibatkan perilaku yang tidak ditentukan, termasuk kesalahan akses yang buruk.
Jadi jika Anda memiliki variabel seperti ini di Swift:
var object: NSObject
Dapatkah saya membaca dan menulis ke variabel ini secara paralel dengan aman? (Tanpa mempertimbangkan arti sebenarnya dari melakukan ini).
objective-c
swift
lassej
sumber
sumber
@atomic
atau@nonatomic
. atau hanya atom secara default. (Swift sangat tidak lengkap, kami tidak tahu banyak sekarang)atomic
umumnya tidak dianggap cukup untuk interaksi aman thread dengan properti, kecuali untuk tipe data sederhana. Untuk objek, seseorang biasanya menyinkronkan akses lintas utas menggunakan kunci (mis.,NSLock
Atau@synchronized
) atau antrean GCD (mis., Antrean serial atau antrean serentak dengan pola "pembaca-penulis").atomic
tidak memastikan keamanan thread untuk objek; dan (b) jika seseorang menggunakan salah satu teknik sinkronisasi yang disebutkan di atas dengan benar untuk memastikan keamanan thread (antara lain, mencegah baca / tulis secara bersamaan), masalah atomik diperdebatkan. Tetapi kita masih membutuhkan / menginginkannya untuk tipe data sederhana, yangatomic
memiliki nilai nyata. Pertanyaan bagus!Jawaban:
Sangat awal untuk mengasumsikan karena tidak ada dokumentasi tingkat rendah yang tersedia, tetapi Anda dapat belajar dari perakitan. Hopper Disassembler adalah alat yang hebat.
Menggunakan
objc_storeStrong
danobjc_setProperty_atomic
untuk nonatomik dan atom, di manapenggunaan
swift_retain
darilibswift_stdlib_core
dan, tampaknya, tidak dilengkapi pengaman benang.Kami dapat berspekulasi bahwa kata kunci tambahan (mirip dengan
@lazy
) mungkin diperkenalkan nanti.Pembaruan 07/20/15 : menurut posting blog ini di lingkungan cepat lajang dapat membuat kasus-kasus tertentu aman untuk Anda, yaitu:
Pembaruan 05/25/16 : Perhatikan proposal evolusi cepat https://github.com/apple/swift-evolution/blob/master/proposals/0030-property-behavior-decls.md - sepertinya begitu akan mungkin memiliki
@atomic
perilaku yang diterapkan sendiri.sumber
Swift tidak memiliki konstruksi bahasa seputar keamanan thread. Diasumsikan bahwa Anda akan menggunakan library yang disediakan untuk melakukan manajemen keamanan thread Anda sendiri. Ada banyak opsi yang Anda miliki dalam mengimplementasikan keamanan thread termasuk pthread mutexes, NSLock, dan dispatch_sync sebagai mekanisme mutex. Lihat posting terbaru Mike Ash tentang subjek: https://mikeash.com/pyblog/friday-qa-2015-02-06-locks-thread-safety-and-swift.html Jadi jawaban langsung untuk pertanyaan Anda tentang "Can Saya membaca dan menulis ke variabel ini secara paralel dengan aman? " Tidak.
sumber
Mungkin terlalu dini untuk menjawab pertanyaan ini. Saat ini swift tidak memiliki pengubah akses, jadi tidak ada cara yang jelas untuk menambahkan kode yang mengelola konkurensi di sekitar pengambil / penyetel properti. Selain itu, Bahasa Swift sepertinya belum memiliki informasi tentang konkurensi! (Itu juga tidak memiliki KVO dll ...)
Saya pikir jawaban atas pertanyaan ini akan menjadi jelas di rilis mendatang.
sumber
willSet
,didSet
- tampaknya menjadi langkah pertama dalam perjalananDetail
Tautan
Jenis yang diterapkan
Ide utama
Contoh akses atom
Pemakaian
Hasil
sumber
Atomic
kelas dan jalankan menggunakanAtomic().semaphoreSample()
Dari Swift 5.1 Anda dapat menggunakan pembungkus properti untuk membuat logika khusus untuk properti Anda. Ini adalah implementasi atomic wrapper:
Cara Penggunaan:
sumber
Berikut adalah pembungkus properti atom yang saya gunakan secara ekstensif. Saya membuat mekanisme penguncian yang sebenarnya sebagai protokol, jadi saya bisa bereksperimen dengan mekanisme yang berbeda. Saya mencoba semaphores
DispatchQueues
,, danpthread_rwlock_t
. Itupthread_rwlock_t
dipilih karena tampaknya memiliki overhead terendah, dan kemungkinan inversi prioritas yang lebih rendah.sumber