Perbedaan antara Operasi Atom dan Keamanan Utas?

10

Dari diskusi saya telah melihat bahwa operasi atom dan keselamatan ulir adalah hal yang sama, tetapi banyak orang mengatakan bahwa mereka berbeda. Adakah yang bisa memberi tahu saya perbedaannya jika ada?

pengguna960567
sumber
4
Pengoperasian atom akan membantu memastikan keselamatan ulir, tetapi bagaimana mereka bisa menjadi hal yang sama ? "Utas" tidak sama dengan "operasi".
user50849

Jawaban:

11

Operasi atom adalah cara untuk mencapai keselamatan ulir baik dengan menggunakan beberapa jenis kunci seperti Mutex atau Semaphores yang menggunakan operasi atom secara internal atau dengan menerapkan sinkronisasi bebas kunci menggunakan atom dan pagar memori.

Jadi operasi atom pada tipe data primitif adalah alat untuk mencapai keselamatan ulir tetapi tidak memastikan keamanan ulir secara otomatis karena Anda biasanya memiliki beberapa operasi yang saling bergantung. Anda harus memastikan bahwa operasi ini dilakukan tanpa gangguan misalnya menggunakan Mutex.

Ya, menulis salah satu dari tipe data atom ini dalam c # adalah thread aman, tetapi itu tidak membuat fungsi yang Anda gunakan dalam thread aman. Ini hanya memastikan bahwa penulisan tunggal dijalankan dengan benar bahkan jika utas kedua mengaksesnya "pada saat yang sama". Namun demikian, bacaan berikutnya dari utas saat ini tidak dipastikan untuk mendapatkan nilai yang sebelumnya ditulis sebagai utas yang berbeda mungkin telah ditulis untuk itu, hanya saja nilai yang dibaca valid.

Archy
sumber
Apakah int, bool, float aman untuk benang atau atom?
user960567
1
@ user960567 - tipe data hanya itu: tipe data. Terserah kompiler untuk memutuskan bagaimana mengaksesnya. Pikirkan int64 pada CPU 8086.
mouviciel
2
Dalam C # khusus, bahwa pertanyaan ditandai, dibaca dan ditulis harus atom pada tipe data dasar. Lihat Ecma 334
user50849
2
Dan ya, menulis salah satu dari tipe data atom ini di c # adalah thread aman, tetapi itu tidak membuat fungsi yang Anda gunakan dalam thread aman. Ini hanya memastikan bahwa penulisan tunggal dijalankan dengan benar bahkan jika utas kedua mengaksesnya "pada saat yang sama". Namun demikian, bacaan berikutnya dari utas saat ini tidak dipastikan untuk mendapatkan nilai yang sebelumnya ditulis sebagai utas yang berbeda mungkin telah ditulis untuk itu, hanya saja nilai yang dibaca valid.
Archy
4
x = 5 adalah atom dalam c #. Tetapi segera setelah operasi ini bisa ditimpa. x = x + 1 dijalankan oleh 1. memuat x ke register 2. kenaikan x dalam register 3. menyimpan x ke dalam memori. Jika utas kedua melakukan hal yang sama pada saat yang sama, keduanya akan memuat nilai yang sama, menambahkannya dan menyimpannya sehingga x hanya bertambah satu kali alih-alih dua kali. InterlockedIncrement baik menggunakan instruksi prosesor khusus untuk mengeksekusi kenaikan atom atau memastikan ini dengan menggunakan mekanisme penguncian, misalnya CAS, untuk memastikan bahwa sementara nilai baru tidak ditulis, utas lainnya tidak dapat membaca nilai lama.
Archy
3

Atomicity dan keamanan benang adalah dua hal yang berbeda. Atomicity mengacu pada kualitas operasi "semua atau tidak sama sekali"; Jika suatu operasi tidak dapat dilakukan 100% dengan sukses, maka sistem harus tetap dalam keadaan keseluruhan sebelum sebelum bagian operasi dimulai. Contoh klasik adalah transaksi basis data; Saat menyimpan faktur, termasuk tajuknya dan beberapa item baris, setiap bagian dari setiap baris basis data harus ditempatkan dengan sukses; jika tidak, data hilang atau rusak. Jika item baris tidak dapat disisipkan, maka tidak hanya seharusnya tidak ada baris lain yang tersisa dimasukkan, tetapi tidak ada baris yang sudah diproses harus tetap ada.

Thread-safety mengacu pada kombinasi hal-hal, termasuk atomicity, yang memungkinkan operasi menjadi "reentrant"; banyak pekerja dapat melakukan operasi yang sama, mulai pada waktu yang sama atau berbeda, tanpa mempengaruhi yang lain. Ada banyak model untuk pengoperasian yang aman dengan benang; kebanyakan dari mereka bermuara secara konseptual baik menjalankan beberapa tugas paralel dalam isolasi lengkap (dua pekerja dapat melakukan tugas yang sama pada dua objek yang berbeda atau kumpulan objek tanpa pernah mengetahui pekerja lain bahkan ada), atau menyiapkan "pipa" di mana beberapa pekerja masing-masing melakukan satu tugas dari seluruh operasi (baik masing-masing pekerja berkembang dari tugas pertama ke yang berikutnya dan seterusnya, atau yang lain berfokus pada satu tugas dan menyerahkan "produk kerja" perantara ke pekerja berikutnya).

KeithS
sumber
2

Operasi atom adalah operasi yang tidak dapat diinterupsi.

Thread yang aman adalah thread yang dapat dengan aman diinterupsi.

Keamanan benang diperoleh dengan operasi atom, khususnya dalam logika yang mencegah sumber daya kritis diakses berulang kali.

Operasi atom dasar adalah Uji-dan-set , yang digunakan untuk menerapkan semafor, yang pada gilirannya digunakan untuk menerapkan keselamatan ulir.

mouviciel
sumber
Tidak bisakah operasi multi-langkah terganggu dan masih disebut atom jika dijamin dapat mengembalikan perubahannya?
user50849
1
Tidak. Atom harus dipahami dalam arti etimologisnya: ἄτομος, atomos, tidak dapat dibagi.
mouviciel
Apakah int, bool, float aman untuk benang atau atom?
user960567
Tapi bukankah ada perbedaan antara tidak bisa dipisahkan, dan tampil tidak terpisahkan bagi pengamat ? Menurut definisi Anda, bukan operasi atom dapat mengandung lebih dari satu langkah. Saya percaya kata "muncul" dalam definisi wikipedia tentang operasi Atom adalah penting. (Saya sedang mengobrol jika ada yang ingin membawanya ke sana) :)
user50849
Ada satu perbedaan besar: utas aman dapat diinterupsi, dan tidak ada jaminan berapa banyak waktu. Ini sangat penting dalam komputasi waktu nyata. Operasi atom (dengan kunci interupsi jika multi-langkah) dijamin untuk berakhir setelah waktu yang dapat diprediksi.
mouviciel
1

Thread-safety lebih merupakan kerangka kerja atau "konsep", operasi atom adalah subset, sarana (salah satu dari banyak) untuk mencapai status sebagai diklasifikasikan sebagai 'thread-safe'.

Keamanan thread mengacu pada proses yang dapat diakses oleh utas terpisah, di mana akses satu (dan manipulasi data), tidak akan merusak integritas operasi yang lain.

Sebagian besar keterampilan programmer mengetahui cara mencapai hal ini, tergantung pada situasi dan tujuan utama, Anda mungkin perlu menerapkan, misalnya: kunci, semafor, kait, benda atom, aturan sinkronisasi dll ...

ADP
sumber