java - Bagaimana untuk memahami kunci putaran dan kunci mutex?
给我你的怀抱
给我你的怀抱 2017-06-14 10:51:20
0
3
900

Saya telah membaca banyak artikel dalam talian dan saya masih keliru. Bolehkah sesiapa menerangkan kedua-dua konsep ini kepada saya dengan cara yang mudah difahami?

Dalam pengekodan berbilang benang Python, saya biasanya menggunakan seketika True infinite loop dalam kaedah run thread, kemudian panggil queue.task_done di hujung badan gelung gelung infinite untuk mengalih keluar baris gilir, dan kemudian panggil baris gilir kaedah bergabung dalam utas utama untuk menyekat utas utama menghalang utas utama daripada tamat secara langsung Adakah kaedah pengekodan berbilang benang ini munasabah. Adakah terdapat sebarang pepijat? Di samping itu, saya ingin bertanya sama ada gelung tak terhingga yang saya panggil dalam larian dipanggil kunci putaran?

给我你的怀抱
给我你的怀抱

membalas semua(3)
小葫芦

Pertama sekali, anda mesti faham apa itu kunci mutex dan maksudnya
Ia adalah apabila dua utas A dan B mengakses memori yang sama.
Sebaik-baiknya, perintah pelaksanaan kami ialah selepas A dilaksanakan sepenuhnya, B akan dilaksanakan, namun, pelaksanaan akan menduduki masa arahan CPU Jika tiada mekanisme digunakan, apabila A dilaksanakan separuh jalan, B akan menduduki CPU B akan menduduki CPU Untuk memproses memori ini, kemudian B menyelesaikan pelaksanaan, dan A mendapat CPU semula, bukankah data memori itu salah?
Untuk keselamatan data memori. Teknologi yang saling eksklusif digunakan Apabila A mengakses memori ini, ia mula-mula menentukan sama ada memori ini mempunyai bendera yang digunakan (bernama kunci Jika tidak, ia menambah bendera (kunci) pada memori ini memori, dan A membuka kuncinya selepas pemprosesan. Jika B datang untuk mengakses semasa A sedang memproses memori, B akan melihat bahawa memori ini mempunyai tanda sedang digunakan (kunci), dan B boleh mempunyai beberapa gelagat. Kelakuan 1: Mengambil CPU. Gelung dan uji status kunci secara berterusan Benang tidak akan tergantung (tidur) dan berada dalam keadaan menunggu yang sibuk Kunci yang menggunakan tingkah laku ini dipanggil kunci putaran. Kelakuan 2: Benang B tidur dan terhalang, menyerahkan CPU sehingga A selesai melaksanakan dan kunci hilang, kemudian menggunakan memori. Tingkah laku ini dipanggil kunci mutex. Selepas melihat ini, anda mungkin faham bahawa kunci ialah mekanisme penyegerakan yang melaksanakan pengecualian bersama. Kunci putaran hanyalah kes kunci mutex (ia akan menduduki kunci mutex CPU semasa menunggu).
Jangan terpedaya dengan nama. Untuk memahami mekanisme di sebaliknya, anda perlu memahaminya walaupun anda menukar nama,
Pautan rujukan Penerangan pautan

过去多啦不再A梦

1. Apabila menggunakan gelung sementara dalam kaedah larian berbilang benang Python, jika mekanisme program berhenti tidak digunakan dalam badan gelung, ia akan terus berjalan, jika anda ingin membuat kod dengan betul, anda boleh menggunakan semaphore atau mekanisme pembolehubah lain untuk memberitahu badan gelung Berhenti, atau tentukan sama ada baris gilir kosong, putus terus dan keluar dari gelung.

2. Gelung tak terhingga dalam larian bukanlah kunci putaran Jika terdapat persaingan sumber dalam gelung, kunci akan ditambah, tetapi kunci ini juga merupakan kunci pengecualian bersama.
Kunci Python menggunakan semaphore, bukan spinlock.

// https://svn.python.org/projects/python/trunk/Python/thread_atheos.h
static int fastmutex_lock(fastmutex_t * mutex)
{
    atomic_t prev = atomic_add(&mutex->count, 1);
    if (prev > 0)
        return lock_semaphore(mutex->sem);
    return 0;
}

Kunci putaran: Berbilang utas mengakses sumber yang sama pada masa yang sama Kunci yang ditetapkan untuk mengelakkan bacaan dan pengubahsuaian sumber yang tidak konsisten Jika utas sudah menduduki sumber apabila utas mengakses sumber, maka utas yang terakhir akan menunggu semasa. utas untuk melepaskan sumber Pada masa ini, yang terakhir (tanpa tidur) terus menjalankan CPU untuk mengesan sama ada sumber yang diduduki oleh yang pertama dilepaskan Mekanisme yang membolehkannya mengakses dan mengesan penggunaan sumber secara berterusan ialah kunci putaran.

Kunci Mutex: Tujuannya adalah sama dengan kunci putaran, tetapi mekanismenya berbeza Apabila utas menduduki sumber, kunci ditambahkan Apabila utas terakhir mengakses sumber, ia memasuki keadaan tidur kerana sumber telah diisi , dan menunggu sumber dikeluarkan Akhirnya, benang menunggu dimaklumkan melalui semaphore.

过去多啦不再A梦

Kod Python akan berjalan mengikut proses ini,

  1. Sediakan GIL

  2. Tukar ke benang tertentu

  3. Lari

  4. Benang keluar dan ditetapkan kepada keadaan tidur

  5. Buka kunci GIL

  6. Ulang operasi di atas

Mungkin kerana GIL, saya nampaknya tidak pernah melihat kunci putaran dalam Python, dan kunci mutex kebanyakannya digunakan.

Berikut adalah kaedah yang saya gunakan untuk menulis multi-threading, untuk rujukan sahaja~

import Queue
from threading import Thread

temp_queue = Queue.Queue()


class Test(Thread):
    def __init__(self):
        Thread.__init__(self)

    def run(self):
        while temp_queue.empty() is False:
            pass
            # do sth here
            # temp = temp_queue.get()


tasks = []
for i in range(10):
    tasks.append(Test())

for task in tasks:
    task.start()

for task in tasks:
    task.join()

Memandangkan ia adalah baris gilir, Queue().get() dalam Queue menerangkan Alih keluar dan kembalikan item daripada baris gilir.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan