“Pacman в настоящее время используется, пожалуйста, подождите”: руководство по обработке блокировки ресурсов
Метод 1: блокировки мьютексов
Представьте, что вы находитесь в буфете, и там есть только один поднос с аппетитной пиццей. Чтобы все не спешили и не создавали хаос, используется блокировка мьютекса. Только один человек может одновременно удерживать замок, гарантируя, что доступ к пицце сможет получить только один человек. Аналогичным образом, в коде блокировка мьютекса гарантирует, что только один поток может получить доступ к общему ресурсу в любой момент времени.
Вот фрагмент кода на Python, иллюстрирующий использование мьютексов:
import threading
pizza_lock = threading.Lock()
def eat_pizza():
with pizza_lock:
# Code to access the pizza resource
print("Nom nom... delicious pizza!")
# Create multiple threads to simulate hungry people
thread1 = threading.Thread(target=eat_pizza)
thread2 = threading.Thread(target=eat_pizza)
# Start the threads
thread1.start()
thread2.start()
# Wait for the threads to finish
thread1.join()
thread2.join()
Метод 2: Семафоры
Теперь представим, что вы на вечеринке, и в зоне отдыха есть только три места. Семафор похож на вышибалу, который отслеживает свободные места. Когда кто-то входит в зону отдыха, семафор уменьшает счет на единицу. Если свободных мест нет, семафор заставит человека ждать, пока место освободится.
Вот фрагмент кода на Java, демонстрирующий использование семафоров:
import java.util.concurrent.Semaphore;
Semaphore seats = new Semaphore(3);
class Person extends Thread {
@Override
public void run() {
try {
seats.acquire();
// Code to access the chill-out area
System.out.println("Relaxing in the chill-out area...");
Thread.sleep(2000); // Simulating some relaxation time
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
seats.release();
}
}
}
// Create multiple threads to simulate people entering the chill-out area
Person person1 = new Person();
Person person2 = new Person();
Person person3 = new Person();
person1.start();
person2.start();
person3.start();
person1.join();
person2.join();
person3.join();
Метод 3: блокировки чтения и записи
Представьте, что вы находитесь в библиотеке, и несколько человек хотят читать книги, а другие хотят писать новые книги. Блокировка чтения-записи позволяет нескольким потокам читать книги одновременно, но только один поток может записывать новую книгу одновременно.
Вот пример использования класса ReadWriteLock
в Java:
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
ReadWriteLock bookLock = new ReentrantReadWriteLock();
// Code for reading the book
bookLock.readLock().lock();
try {
// Code to read the book
System.out.println("Reading an interesting book...");
} finally {
bookLock.readLock().unlock();
}
// Code for writing a new book
bookLock.writeLock().lock();
try {
// Code to write a new book
System.out.println("Writing a new bestseller...");
} finally {
bookLock.writeLock().unlock();
}
В заключение, блокировка ресурсов имеет решающее значение для поддержания целостности данных и предотвращения состояний гонки в параллельном программировании. В этой статье мы рассмотрели три популярных метода: блокировки мьютексов, семафоры и блокировки чтения-записи. Используя эти методы, вы можете гарантировать, что ваш код работает плавно и эффективно, не сталкиваясь с ужасным сообщением «Pacman сейчас используется, подождите».
Помните, что эффективная блокировка ресурсов — это фундаментальный навык для любого разработчика, и понимание этих методов поможет вам писать надежный и потокобезопасный код. Так что вперед, внедряйте эти методы в свои проекты и попрощайтесь с этими неприятными конфликтами ресурсов!