Rumah  >  Artikel  >  Operasi dan penyelenggaraan  >  Bagaimana untuk menyelesaikan masalah akses serentak berbilang benang dan berbilang benang Linux ke memori yang sama

Bagaimana untuk menyelesaikan masalah akses serentak berbilang benang dan berbilang benang Linux ke memori yang sama

WBOY
WBOYke hadapan
2023-05-17 17:26:232102semak imbas

Mengapa anda memerlukan multi-threading?

  • Keupayaan entiti selari untuk berkongsi ruang alamat yang sama dan semua data yang tersedia tidak boleh dinyatakan dengan kunci berbilang proses kerana berbilang proses mempunyai ruang alamat yang berbeza

  • Benang adalah lebih ringan dan lebih cepat daripada proses; 🎜>

  • Dalam sistem multi-cpu, multi-threading bermanfaat. multi-threading
  • Mempercepatkan tindak balas program; diberikan kepada tugas lain Tugasan;
  • Tugas yang mengambil banyak masa pemprosesan boleh secara berkala memberikan masa pemproses kepada tugasan lain; boleh dihentikan pada bila-bila masa;

Tugas yang memakan masa atau intensif pemproses menyekat operasi antara muka pengguna; )
  • Kelemahan berbilang benang
  • Menunggu sumber yang dikongsi akan memperlahankan kelajuan berjalan program ini sumber yang dikongsi terutamanya sumber, seperti pencetak;
  • Menguruskan benang memerlukan overhed CPU tambahan; 🎜>
  • Bacaan atau penulisan serentak pembolehubah awam selalunya menghasilkan ralat yang tidak dapat diramalkan

  • Idea pengesahan

  • Membaca atau menulis pembolehubah global yang sama (nilai awal ialah 0 ), gunakan lima fungsi utas untuk melaksanakan operasi ++, setiap fungsi utas ++ 1000 kali, oleh itu, 5 utas kami hendaklah ++ 5000 kali, dan nilai akhir pembolehubah global hendaklah 5000.

  • Melakukan percubaan yang berbeza dan mendapati bahawa nilai wg kadangkala 5000, kadangkala 4997 atau 4998.

  • Alasannya ialah:
  • Apa yang kita lakukan dengan wg++ bukan operasi atom Ia ditukarkan kepada arahan komputer menukar pembolehubah secara automatik. Operasi ini dibahagikan kepada banyak langkah Contohnya, terdapat dua utas untuk wg++
, tetapi ++ tidak boleh dilengkapkan sekali gus baca semula Operasi ini belum selesai , utas lain juga membaca wg, ++, dan kemudian membacanya kembali. Ada kemungkinan bahawa dua benang menambah wg=1;, tetapi nilai akhir ialah 2.

Kami tidak boleh hanya mempertimbangkan masalah di peringkat kod, kami juga perlu mempertimbangkan persekitaran di mana kod berjalan Dengan memerhatikan tetapan mesin maya kami, kami mendapati bahawa: terdapat 4 pemproses, di sekurang-kurangnya dua daripadanya mengendalikan utas lain Terdapat situasi di mana satu utas diletakkan pada dua pemproses dan diakses pada masa yang sama Kebarangkalian kejadian adalah kurang daripada 5000 adalah agak tinggi, yang juga disebabkan oleh pelaksanaan selari.
  • Selepas mendayakan hanya satu pemproses, hanya satu utas sedang dilaksanakan, dan empat utas yang lain pastinya tidak dilaksanakan. Tiada situasi di mana dua utas dilaksanakan pada masa yang sama .
  • Kebarangkalian untuk muncul kurang daripada 5000 adalah sangat kecil (sebabnya ialah selepas membaca nilai val 1, anda belum sempat ++ kembali. Pada masa ini, kepingan masa telah tiba, dan suis telah berlaku. Tukar ke urutan lain, dan bacaannya masih sama 1. Tambah dan tambah, pemulihan di tapak, atau 1 untuk menambah dan menambah Kebarangkalian senario ini berlaku adalah sangat kecil) Satu pemproses tidak boleh menjadi selari.

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan masalah akses serentak berbilang benang dan berbilang benang Linux ke memori yang sama. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam