Apa itu Mutual Exclusion (Mutex)?
Dalam pemrograman komputer, mutual exclusion (mutex) adalah sebuah objek program yang mencegah beberapa thread mengakses sumber daya bersama secara bersamaan. Sumber daya bersama dalam konteks ini adalah elemen kode dengan critical section, yaitu bagian kode yang tidak boleh dieksekusi oleh lebih dari satu thread pada saat yang bersamaan. Contohnya, critical section dapat digunakan untuk memperbarui variabel global, memodifikasi tabel dalam sebuah database, atau menulis file ke sebuah server. Dalam kasus seperti ini, akses ke sumber daya bersama harus dikendalikan untuk mencegah masalah pada data atau program itu sendiri.
Apa itu Objek Mutex?
Dalam program multithreading, mutex adalah mekanisme yang digunakan untuk memastikan bahwa beberapa thread yang berjalan secara bersamaan tidak mencoba mengeksekusi critical section pada kode secara bersamaan. Jika mutex tidak digunakan, program dapat mengalami race condition, yaitu situasi di mana beberapa thread mencoba mengakses sumber daya yang sama dalam waktu yang bersamaan. Ketika hal ini terjadi, hasil yang tidak diinginkan dapat muncul, seperti data yang dibaca atau ditulis dengan tidak benar, atau program yang berperilaku tidak semestinya hingga mengalami crash.
Untuk memahami cara kerja mutex, pertimbangkan program multithreading yang memiliki metode untuk memperbarui variabel penghitung. Metode ini bertanggung jawab untuk membaca nilai saat ini, menambahnya dengan 1, dan menulis kembali ke memori. Jika dua thread menjalankan metode ini satu per satu secara berurutan, nilai akhirnya akan diperbarui dengan benar. Namun, jika kedua thread membaca nilai sebelum ada perubahan, hasil akhirnya bisa salah.
Mutex dalam Pemrograman
Sebuah program multithreading dapat secara eksplisit meminta mutex untuk setiap sumber daya bersama dari sistem. Jika sebuah thread perlu mengakses sumber daya tersebut, pertama-tama harus memeriksa apakah mutex sudah terkunci atau belum. Jika tidak terkunci, thread dapat mengeksekusi critical section. Jika terkunci, sistem biasanya akan mengantrekan thread hingga mutex tidak lagi terkunci.
Implementasi Mutex dalam Python
Di Python, mutex dapat diterapkan menggunakan modul threading
. Contoh berikut menunjukkan cara kerja mutex dalam Python:
import threading
import time
mutex = threading.Lock()
def get_data(cnt):
mutex.acquire()
try:
thread_id = threading.get_ident()
time.sleep(0.5)
print(f"Count: {cnt} (thread {thread_id})")
finally:
mutex.release()
count = 1
max_count = 10
while True:
thread = threading.Thread(target=get_data, args=(count,))
thread.start()
count += 1
if count > max_count:
break
Pada skrip di atas:
- Mutex dibuat menggunakan
threading.Lock()
. - Fungsi
get_data
meminta mutex denganacquire()
dan melepaskannya denganrelease()
setelah selesai. - Program membuat thread baru dalam loop yang memastikan hanya satu thread yang dapat mengakses sumber daya dalam satu waktu.
Tanpa Mutex
Berikut adalah contoh tanpa mutex, yang menunjukkan hasil tidak teratur:
import threading
import time
def get_data(cnt):
time.sleep(0.5)
thread_id = threading.get_ident()
print(f"Count: {cnt} (thread {thread_id})")
count = 1
max_count = 10
while True:
thread = threading.Thread(target=get_data, args=(count,))
thread.start()
count += 1
if count > max_count:
break
Perkembangan Teknologi Terkait Mutex
Dalam beberapa tahun terakhir, penggunaan mutex telah berkembang dengan teknologi baru seperti:
- Transactional Memory: Konsep ini mengurangi kebutuhan akan mutex dengan memungkinkan transaksi atomik dalam akses memori bersama.
- Lock-Free Data Structures: Struktur data yang tidak memerlukan mutex, mengurangi overhead dalam lingkungan multithreading.
- Rust Programming Language: Bahasa pemrograman Rust memiliki fitur “ownership” yang mencegah race condition tanpa memerlukan mutex secara eksplisit.
Mutex tetap menjadi solusi utama untuk menghindari race condition, tetapi perkembangan teknologi terus menawarkan alternatif yang lebih efisien.