C#中使用Interlocked进行原子操作的技巧
什么是原子操作?
原子(atom)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为”不可被中断的一个或一系列操作” 。在C#中有多个线程同时对某个变量进行操作的时候,我们应该使用原子操作,防止多线程取到的值不是最新的值。
例如:int result = 0;
多线程A正在执行 result(0)+1
多线程B同时执行 result(0)+1
那么最终result的结果是1还是2呢,这个就很难说了。如果在CPU中2个线程同时计算,那么得到的结果则是1,显然这个结果不是我们想要的。当然你可以使用lock锁来保障多线程执行的唯一性,但是它的性能远远不及原子操作的方式。
使用Interlocked进行原子操作:
使用.NET提供的Interlocked类可以对一些数据进行原子操作,看起来似乎跟lock锁一样,但它并不是lock锁,它的原子操作是基于CPU本身的,非阻塞的,所以要比lock的效率高。
下面使用C#代码进行演示了原子操作:
class Program { //全局变量 private static int _result; //Main方法 static void Main(string[] args) { //运行后按住Enter键数秒,对比使用Interlocked.Increment(ref _result);与 _result++;的不同 while (true) { Task[] _tasks = new Task[100]; int i = 0; for (i = 0; i < _tasks.Length; i++) { _tasks[i] = Task.Factory.StartNew((num) => { var taskid = (int)num; Work(taskid); }, i); } Task.WaitAll(_tasks); Console.WriteLine(_result); Console.ReadKey(); } } //线程调用方法 private static void Work(int TaskID) { for (int i = 0; i < 10; i++) { //_result++; Interlocked.Increment(ref _result); } } }
以上代码运行分别注释最后两行代码_result++;与Interlocked.Increment(ref _result);的其中一行再运行,运行后按住Enter键不放运行数秒,即可看出区别两者的区别。
至此,就体现出了Interlocked的作用,本文示例源码下载:Interlocked_Sample.
关于原子操作的其他说明:在32位CPU执行赋值指令,数据传输最大宽度4个字节。所以只要在4个字节以下读写操作的,32位CPU都是原子操作。所以bool、int这些类型的操作本身就是原子操作。而Interlocked提供的原子操作方法则是底层进行了功能性CPU指令封装来完成的。
以上所述是小编给大家介绍的C#中使用Interlocked进行原子操作的技巧,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。 更多相关文章请关注PHP中文网(www.php.cn)!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Keselamatan benang boleh dijamin dengan menggunakan operasi atom dalam C++, menggunakan kelas templat std::atomic dan kelas std::atomic_flag untuk mewakili jenis atom dan jenis Boolean masing-masing. Operasi atom dilakukan melalui fungsi seperti std::atomic_init(), std::atomic_load(), dan std::atomic_store(). Dalam kes sebenar, operasi atom digunakan untuk melaksanakan pembilang selamat benang untuk memastikan keselamatan benang apabila berbilang benang mengakses secara serentak, dan akhirnya mengeluarkan nilai pembilang yang betul.

MySQL ialah sistem pengurusan pangkalan data hubungan (RDBMS) yang popular digunakan untuk menguruskan pelbagai jenis data. Dalam pangkalan data, operasi atom merujuk kepada operasi yang tidak boleh diganggu semasa pelaksanaan Operasi ini sama ada semua dilaksanakan dengan jayanya atau semua gagal, dan tidak akan ada situasi di mana hanya sebahagian daripada operasi dilaksanakan Ini adalah ACID (atomicity, consistency ). , pengasingan, kegigihan) prinsip. Dalam MySQL, anda boleh menggunakan kaedah berikut untuk melaksanakan operasi atom pada pangkalan data. Transaksi dalam MySQL

Bagaimana untuk menyelesaikan masalah ketekalan cache dalam pembangunan C++ Dalam pembangunan C++, masalah ketekalan cache adalah cabaran biasa dan penting. Apabila benang dalam program berbilang benang dilaksanakan pada pemproses yang berbeza, setiap pemproses mempunyai cache sendiri dan mungkin terdapat ketidakkonsistenan data antara cache ini. Ketidakkonsistenan data ini boleh membawa kepada ralat yang tidak dijangka dan tingkah laku program yang tidak ditentukan. Oleh itu, menyelesaikan masalah konsistensi cache dalam pembangunan C++ adalah sangat kritikal. Dalam C++, terdapat pelbagai cara untuk menyelesaikan masalah koheren cache

Apabila menulis aplikasi berbilang benang, adalah sangat penting untuk mempertimbangkan keselamatan benang. Memastikan keselamatan utas, membolehkan berbilang utas berfungsi bersama, dan meningkatkan kecekapan menjalankan program adalah isu yang patut dipertimbangkan sepenuhnya. Java menyediakan banyak fungsi operasi atom, termasuk fungsi operasi integer atom - AtomicInteger. AtomicInteger ialah kelas atom di Jawa yang boleh melaksanakan operasi atom pada pembolehubah integer. Operasi atom yang dipanggil bermakna bahawa hanya boleh ada

Sama ada penetapan pembolehubah dalam Golang mempunyai operasi atom memerlukan contoh kod khusus Dalam pengaturcaraan, operasi atom merujuk kepada operasi yang tidak boleh diganggu, iaitu, sama ada kesemuanya berjaya dilaksanakan atau tiada satu pun daripadanya dilaksanakan. Dalam pengaturcaraan serentak, kepentingan operasi atom adalah jelas, kerana dalam program serentak, berbilang benang (atau goroutine) boleh mengakses dan mengubah suai pembolehubah yang sama pada masa yang sama Jika tiada operasi atom, keadaan perlumbaan akan berlaku. Sebagai bahasa pengaturcaraan yang menyokong konkurensi, Golang juga menyediakan sokongan untuk operasi atom. untuk

Penyelidikan tentang hubungan antara operasi atom dan penetapan pembolehubah Golang Pengenalan: Dalam pengaturcaraan serentak, operasi atom ialah operasi khas yang boleh memastikan keatoman operasi. Sebagai bahasa yang menyokong pengaturcaraan serentak, Golang menyediakan fungsi yang berkaitan dengan operasi atom, seperti fungsi dalam pakej atom. Artikel ini akan meneroka hubungan antara operasi atom dan penetapan pembolehubah Golang, dan mendalami pemahaman melalui contoh kod tertentu. 1. Konsep asas operasi atom Operasi atom merujuk kepada ciri bahawa operasi tidak akan terganggu semasa pelaksanaan

Dalam sains komputer, pengaturcaraan serentak ialah apabila program boleh melaksanakan pelbagai tugas secara serentak. Ia sering digunakan untuk menggunakan sepenuhnya kuasa pengkomputeran pemproses berbilang teras dan memainkan peranan penting dalam bidang seperti antara muka pengguna, komunikasi rangkaian dan operasi pangkalan data. Walau bagaimanapun, pengaturcaraan serentak juga membawa beberapa cabaran, yang paling penting ialah cara memastikan ketekalan data dan ketepatan program apabila berbilang rangkaian mengakses sumber yang dikongsi secara serentak. Java menyediakan penyegerakan benang yang kaya dan mekanisme pengecualian bersama untuk membantu pembangun menyelesaikan cabaran dalam pengaturcaraan serentak. Mekanisme ini terutamanya termasuk kunci, operasi atom dan kata kunci yang tidak menentu. Kunci digunakan untuk melindungi sumber kongsi Ia membenarkan satu utas memonopoli sumber kongsi apabila mengaksesnya, menghalang utas lain daripada mengaksesnya pada masa yang sama, sekali gus mengelakkan ketidakkonsistenan data dan ranap program.

Golang ialah bahasa pengaturcaraan yang cekap dan mudah untuk menulis perisian berskala. Ia menampilkan konkurensi dan selari, membolehkan pengaturcara menulis perisian berprestasi tinggi dengan cara yang mudah dan mudah. Operasi atom dan penimbalan saluran di Golang adalah antara alat yang paling biasa digunakan yang direka untuk mengoptimumkan prestasi dan kestabilan program. Operasi atom ialah operasi yang dijamin akan disegerakkan merentas berbilang konteks serentak. Golang menyediakan beberapa operasi atom yang membolehkan pengaturcara melaksanakan satu atau lebih arahan dengan cara selamat benang. Dalam multithreading ia sepatutnya
