C Academy · Pelajaran

Penyegerakan dan Keadaan Perlumbaan

Laksanakan mutex dan semafor untuk mengurus sumber dikongsi dengan selamat.

Pelajaran 3 daripada 310 langkah

Penyegerakan dan Keadaan Perlumbaan ialah pelajaran C Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 3. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran C Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus C Academy merangkumi sejumlah 3 pelajaran.

Penyegerakan dan Keadaan Perlumbaan

Apabila beberapa utas mengakses sumber yang dikongsi, keadaan perlumbaan boleh berlaku lalu menghasilkan keputusan yang tidak dapat diramalkan.

Dalam pelajaran ini, anda akan mempelajari:

  • Apakah keadaan perlumbaan dan cara keadaan itu berlaku.
  • Cara menggunakan mutex untuk mencegah keadaan perlumbaan.
  • Cara semafor membantu mengurus sumber yang dikongsi.
Penyegerakan dan Keadaan Perlumbaan — ilustrasi 1

Apakah itu Keadaan Perlumbaan?

Keadaan perlumbaan berlaku apabila beberapa utas mengakses data yang dikongsi secara serentak lalu menghasilkan tingkah laku yang tidak dapat diramalkan.

Contoh:

  • Dua utas cuba mengemas kini pembilang global.
  • Nilai akhir mungkin tidak betul akibat gangguan.

Contoh: Keadaan Perlumbaan dalam Penggunaan Pelbagai Utas

Atur cara ini menunjukkan keadaan perlumbaan apabila beberapa utas mengubah suai pemboleh ubah yang dikongsi.

#include <stdio.h>
#include <pthread.h>

int counter = 0;

void *incrementCounter(void *arg) {
    for (int i = 0; i < 1000000; i++) {
        counter++;
    }
    return NULL;
}

int main() {
    pthread_t t1, t2;
    pthread_create(&t1, NULL, incrementCounter, NULL);
    pthread_create(&t2, NULL, incrementCounter, NULL);
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    printf("Final counter value: %d\n", counter);
    return 0;
}

Mencegah Keadaan Perlumbaan dengan Mutex

Mutex (saling pengecualian) memastikan hanya satu utas mengakses sesuatu sumber pada satu-satu masa.

Fungsi mutex:

  • pthread_mutex_init() - Memulakan mutex.
  • pthread_mutex_lock() - Mengunci mutex.
  • pthread_mutex_unlock() - Membuka kunci mutex.
  • pthread_mutex_destroy() - Memusnahkan mutex.

Contoh: Menggunakan Mutex untuk Mencegah Keadaan Perlumbaan

Atur cara ini membaiki keadaan perlumbaan dengan menggunakan mutex untuk mengawal akses kepada pembilang yang dikongsi.

#include <stdio.h>
#include <pthread.h>

int counter = 0;
pthread_mutex_t lock;

void *incrementCounter(void *arg) {
    for (int i = 0; i < 1000000; i++) {
        pthread_mutex_lock(&lock);
        counter++;
        pthread_mutex_unlock(&lock);
    }
    return NULL;
}

int main() {
    pthread_t t1, t2;
    pthread_mutex_init(&lock, NULL);
    pthread_create(&t1, NULL, incrementCounter, NULL);
    pthread_create(&t2, NULL, incrementCounter, NULL);
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    pthread_mutex_destroy(&lock);
    printf("Final counter value: %d\n", counter);
    return 0;
}

Apakah itu Semafor?

Semafor ialah pembilang yang digunakan untuk mengawal akses kepada sumber.

Fungsi utama:

  • sem_init() - Memulakan semafor.
  • sem_wait() - Mengurangkan nilai semafor.
  • sem_post() - Menambahkan nilai semafor.
  • sem_destroy() - Memusnahkan semafor.

Contoh: Menggunakan Semafor untuk Penyegerakan

Atur cara ini menggunakan semafor untuk mengurus akses kepada sumber yang dikongsi.

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>

sem_t sem;

void *task(void *arg) {
    sem_wait(&sem);
    printf("Thread %d is executing\n", *(int *)arg);
    sem_post(&sem);
    return NULL;
}

int main() {
    pthread_t t1, t2;
    int id1 = 1, id2 = 2;
    sem_init(&sem, 0, 1);
    pthread_create(&t1, NULL, task, &id1);
    pthread_create(&t2, NULL, task, &id2);
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    sem_destroy(&sem);
    return 0;
}

Amalan Terbaik untuk Penyegerakan Utas

Untuk mengelakkan keadaan perlumbaan:

  • Gunakan mutex untuk melindungi pemboleh ubah yang dikongsi.
  • Gunakan semafor untuk pengurusan sumber.
  • Kurangkan penggunaan sumber yang dikongsi jika boleh.

Ringkasan

Dalam pelajaran ini, anda telah mempelajari:

  • Apakah keadaan perlumbaan dan cara keadaan itu berlaku.
  • Cara menggunakan mutex untuk mencegah keadaan perlumbaan.
  • Cara semafor membantu mengurus akses kepada sumber yang dikongsi.

Dengan ini tamatlah bahagian Pelbagai Utas dan Keserentakan dalam C!

Penyegerakan dan Keadaan Perlumbaan — ilustrasi 10
Percuma untuk bermula

Pelajari C dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
39
Pelajaran
144

Soalan Lazim

Adakah pelajaran “Penyegerakan dan Keadaan Perlumbaan” percuma?

Ya — teks penuh “Penyegerakan dan Keadaan Perlumbaan” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus C Academy, tingkat taraf kepada CoddyKit PRO. Kursus C Academy merangkumi sejumlah 3 pelajaran.

Apakah yang akan saya pelajari dalam “Penyegerakan dan Keadaan Perlumbaan”?

Laksanakan mutex dan semafor untuk mengurus sumber dikongsi dengan selamat. Anda berlatih C Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan C Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran C Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 3.

Berapa lamakah pelajaran “Penyegerakan dan Keadaan Perlumbaan” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran C Academy ini?

Ya. Setiap pelajaran C Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Pengenalan kepada Jalur Benang
  2. Mencipta dan Mengurus Jalur Benang
  3. Penyegerakan dan Keadaan Perlumbaan
← Kembali ke C Academy