Rumah pembangunan bahagian belakang tutorial php Mekanisme penyegerakan struktur data di bawah pengaturcaraan serentak PHP

Mekanisme penyegerakan struktur data di bawah pengaturcaraan serentak PHP

May 07, 2024 pm 01:00 PM
php Pengaturcaraan serentak Mekanisme penyegerakan

Dalam pengaturcaraan serentak PHP, mekanisme penyegerakan struktur data berikut adalah penting: bahagian kritikal: gunakan kata kunci disegerakkan untuk melindungi kawasan kod bahagian kritikal, membenarkan hanya satu utas untuk dilaksanakan pada satu masa: dipastikan melalui kunci() dan kaedah buka kunci() Hanya satu utas mengakses sumber yang dikongsi pada satu masa: membenarkan berbilang utas membaca pada masa yang sama, tetapi hanya membenarkan satu utas untuk menulis data yang dikongsi pada satu masa: struktur data FIFO, digunakan untuk menyampaikan mesej dan tugas; timbunan: struktur data LIFO, Digunakan untuk mengurus konteks panggilan. Dalam kes sebenar, perangkak serentak menggunakan baris gilir untuk menyimpan URL yang dirangkak dan menggunakan kunci mutex untuk melindungi hak akses baris gilir untuk mencapai keselamatan benang.

PHP 并发编程下的数据结构同步机制

Mekanisme penyegerakan struktur data di bawah pengaturcaraan serentak PHP

Dalam pengaturcaraan serentak PHP, mekanisme penyegerakan adalah penting untuk memastikan ketepatan dan ketekalan apabila beberapa utas atau proses mengakses data dikongsi pada masa yang sama. Artikel ini akan meneroka mekanisme biasa untuk menyegerakkan struktur data dalam PHP dan menyediakan contoh praktikal untuk digambarkan.

Bahagian Kritikal

Bahagian Kritikal ialah mekanisme penyegerakan yang digunakan untuk melindungi kawasan kod supaya ia hanya boleh dilaksanakan oleh satu utas pada satu masa. Dalam PHP, bahagian kritikal boleh diisytiharkan menggunakan kata kunci synchronized. synchronized 关键字来声明临界区。

class Foo {
    private $data = [];

    public function bar() {
        // 临界区开始
        synchronized($this->data) {
            // 临界区代码,只允许一个线程同时执行
        }
        // 临界区结束
    }
}
Salin selepas log masuk

互斥锁

互斥锁是一种锁对象,用于确保一次只有一个线程可以访问共享资源。PHP 中有多种互斥锁实现,例如 MutexSemaphore 类。

$mutex = new Mutex();

$mutex->lock();
try {
    // 临界区代码...
} finally {
    $mutex->unlock();
}
Salin selepas log masuk

读写锁

读写锁是一种允许多个线程同时读共享数据,但一次只能有一个线程写共享数据的锁对象。PHP 中的 RWLock 类可以实现读写锁。

$rwLock = new RWLock();

$rwLock->lockReadOnly();
try {
    // 多个线程可以同时读取共享数据
} finally {
    $rwLock->unlockReadOnly();
}

$rwLock->lockWrite();
try {
    // 只有一个线程可以写入共享数据
} finally {
    $rwLock->unlockWrite();
}
Salin selepas log masuk

队列

队列是一种 FIFO(先进先出)的数据结构,可用于在并发环境中传递消息和任务。PHP 中的 SplQueue 类提供了队列实现。

$queue = new SplQueue();

$queue->enqueue('任务 1');
$queue->enqueue('任务 2');

while (!$queue->isEmpty()) {
    $task = $queue->dequeue();
    // 处理任务
}
Salin selepas log masuk

栈是一种 LIFO(后进先出)的数据结构,可用于在并发环境中管理调用上下文。PHP 中的 SplStack

$stack = new SplStack();

$stack->push('调用 1');
$stack->push('调用 2');

while (!$stack->isEmpty()) {
    $call = $stack->pop();
    // 处理调用
}
Salin selepas log masuk

Mutex

Mutex ialah objek kunci yang digunakan untuk memastikan hanya satu utas boleh mengakses sumber yang dikongsi pada satu masa. Terdapat pelbagai pelaksanaan mutex dalam PHP, seperti kelas Mutex dan Semaphore.

class Crawler {
    private $queue;
    private $mutex;
    
    public function __construct() {
        $this->queue = new SplQueue();
        $this->mutex = new Mutex();
    }
    
    public function addUrl($url) {
        $this->mutex->lock();
        try {
            $this->queue->enqueue($url);
        } finally {
            $this->mutex->unlock();
        }
    }
    
    public function getNextUrl() {
        $this->mutex->lock();
        try {
            return $this->queue->dequeue();
        } finally {
            $this->mutex->unlock();
        }
    }
}

$crawler = new Crawler();

// 多个线程并发抓取 URL
$threads = [];
for ($i = 0; $i < 10; $i++) {
    $threads[] = new Thread(function() use ($crawler) {
        while (($url = $crawler->getNextUrl()) !== null) {
            // 抓取并处理 URL
        }
    });
}

foreach ($threads as $thread) {
    $thread->start();
}

foreach ($threads as $thread) {
    $thread->join();
}
Salin selepas log masuk

Kunci baca-tulis

🎜🎜Kunci baca-tulis ialah objek kunci yang membenarkan berbilang utas membaca data kongsi pada masa yang sama, tetapi hanya satu utas boleh menulis data dikongsi pada satu-satu masa. Kelas RWLock dalam PHP boleh melaksanakan kunci baca-tulis. 🎜rrreee🎜🎜Queue🎜🎜🎜Queue ialah struktur data FIFO (masuk dahulu, keluar dahulu) yang boleh digunakan untuk menyampaikan mesej dan tugasan dalam persekitaran serentak. Kelas SplQueue dalam PHP menyediakan pelaksanaan baris gilir. 🎜rrreee🎜🎜Timbunan🎜🎜🎜Timbunan ialah struktur data LIFO (terakhir masuk dahulu) yang boleh digunakan untuk mengurus konteks panggilan dalam persekitaran serentak. Kelas SplStack dalam PHP menyediakan pelaksanaan tindanan. 🎜rrreee🎜🎜Kes praktikal: Perangkak serentak🎜🎜🎜Dalam perangkak selari, senarai URL yang dirangkak ialah struktur data dikongsi dan memerlukan mekanisme penyegerakan untuk memastikan keselamatan rangkaian. Amalan biasa ialah menggunakan baris gilir untuk menyimpan URL yang dirangkak dan menggunakan mutex untuk melindungi akses kepada baris gilir. 🎜rrreee🎜Dalam kes ini, baris gilir dan kunci mutex bersama-sama merealisasikan kawalan penyegerakan rangkak serentak berbilang benang, memastikan akses dan pengubahsuaian senarai URL yang betul. 🎜

Atas ialah kandungan terperinci Mekanisme penyegerakan struktur data di bawah pengaturcaraan serentak PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Konfigurasi Projek CakePHP Konfigurasi Projek CakePHP Sep 10, 2024 pm 05:25 PM

Dalam bab ini, kita akan memahami Pembolehubah Persekitaran, Konfigurasi Umum, Konfigurasi Pangkalan Data dan Konfigurasi E-mel dalam CakePHP.

Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 membawa beberapa ciri baharu, peningkatan keselamatan dan peningkatan prestasi dengan jumlah penamatan dan penyingkiran ciri yang sihat. Panduan ini menerangkan cara memasang PHP 8.4 atau naik taraf kepada PHP 8.4 pada Ubuntu, Debian, atau terbitan mereka

Tarikh dan Masa CakePHP Tarikh dan Masa CakePHP Sep 10, 2024 pm 05:27 PM

Untuk bekerja dengan tarikh dan masa dalam cakephp4, kami akan menggunakan kelas FrozenTime yang tersedia.

Muat naik Fail CakePHP Muat naik Fail CakePHP Sep 10, 2024 pm 05:27 PM

Untuk mengusahakan muat naik fail, kami akan menggunakan pembantu borang. Di sini, adalah contoh untuk muat naik fail.

Penghalaan CakePHP Penghalaan CakePHP Sep 10, 2024 pm 05:25 PM

Dalam bab ini, kita akan mempelajari topik berikut yang berkaitan dengan penghalaan ?

Bincangkan CakePHP Bincangkan CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP ialah rangka kerja sumber terbuka untuk PHP. Ia bertujuan untuk menjadikan pembangunan, penggunaan dan penyelenggaraan aplikasi lebih mudah. CakePHP adalah berdasarkan seni bina seperti MVC yang berkuasa dan mudah difahami. Model, Pandangan dan Pengawal gu

Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Dec 20, 2024 am 11:31 AM

Kod Visual Studio, juga dikenali sebagai Kod VS, ialah editor kod sumber percuma — atau persekitaran pembangunan bersepadu (IDE) — tersedia untuk semua sistem pengendalian utama. Dengan koleksi sambungan yang besar untuk banyak bahasa pengaturcaraan, Kod VS boleh menjadi c

Pengesah Mencipta CakePHP Pengesah Mencipta CakePHP Sep 10, 2024 pm 05:26 PM

Pengesah boleh dibuat dengan menambah dua baris berikut dalam pengawal.

See all articles