0Pricing
C Academy · บทเรียน

การซิงโครไนซ์และภาวะแข่งขัน

นำมิวเทกซ์และเซมาฟอร์มาใช้เพื่อจัดการทรัพยากรที่ใช้ร่วมกันอย่างปลอดภัย

การซิงโครไนซ์และภาวะแข่งขัน เป็นบทเรียน C Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C Academy มีบทเรียนทั้งหมด 3 บทเรียน

การประสานการทำงานและภาวะการแข่งขัน

การประสานการทำงานและภาวะการแข่งขัน

เมื่อเธรดหลายเธรดเข้าถึงทรัพยากรที่ใช้ร่วมกัน อาจเกิดภาวะการแข่งขันและนำไปสู่ผลลัพธ์ที่คาดเดาไม่ได้

ในบทเรียนนี้ คุณจะได้เรียนรู้:

  • ภาวะการแข่งขันคืออะไรและเกิดขึ้นได้อย่างไร
  • วิธีใช้มิวเทกซ์เพื่อป้องกันภาวะการแข่งขัน
  • เซมาฟอร์ช่วยจัดการทรัพยากรที่ใช้ร่วมกันได้อย่างไร
การซิงโครไนซ์และภาวะแข่งขัน — ภาพประกอบ 1

ภาวะการแข่งขันคืออะไร

ภาวะการแข่งขันคืออะไร

ภาวะการแข่งขันเกิดขึ้นเมื่อเธรดหลายเธรดเข้าถึงข้อมูลที่ใช้ร่วมกันพร้อมกัน ทำให้เกิดพฤติกรรมที่คาดเดาไม่ได้

ตัวอย่าง:

  • เธรดสองเธรดพยายามอัปเดตตัวนับส่วนกลาง
  • ค่าผลลัพธ์สุดท้ายอาจไม่ถูกต้องเนื่องจากการรบกวนกัน

ตัวอย่าง: ภาวะการแข่งขันในการทำงานหลายเธรด

ตัวอย่าง: ภาวะการแข่งขันในการทำงานหลายเธรด

โปรแกรมนี้สาธิตภาวะการแข่งขันที่เกิดขึ้นเมื่อเธรดหลายเธรดแก้ไขตัวแปรที่ใช้ร่วมกัน

#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;
}

การป้องกันภาวะการแข่งขันด้วยมิวเทกซ์

การป้องกันภาวะการแข่งขันด้วยมิวเทกซ์

มิวเทกซ์ (การกีดกันร่วม) ช่วยให้มีเธรดเพียงหนึ่งเธรดเข้าถึงทรัพยากรได้ในแต่ละครั้ง

ฟังก์ชันของมิวเทกซ์:

  • pthread_mutex_init() - เริ่มต้นมิวเทกซ์
  • pthread_mutex_lock() - ล็อกมิวเทกซ์
  • pthread_mutex_unlock() - ปลดล็อกมิวเทกซ์
  • pthread_mutex_destroy() - ทำลายมิวเทกซ์

ตัวอย่าง: การใช้มิวเทกซ์เพื่อป้องกันภาวะการแข่งขัน

ตัวอย่าง: การใช้มิวเทกซ์เพื่อป้องกันภาวะการแข่งขัน

โปรแกรมนี้แก้ไขภาวะการแข่งขันโดยใช้มิวเทกซ์ควบคุมการเข้าถึงตัวนับที่ใช้ร่วมกัน

#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;
}

เซมาฟอร์คืออะไร

เซมาฟอร์คืออะไร

เซมาฟอร์คือตัวนับที่ใช้ควบคุมการเข้าถึงทรัพยากร

ฟังก์ชันสำคัญ:

  • sem_init() - เริ่มต้นเซมาฟอร์
  • sem_wait() - ลดค่าของเซมาฟอร์
  • sem_post() - เพิ่มค่าของเซมาฟอร์
  • sem_destroy() - ทำลายเซมาฟอร์

ตัวอย่าง: การใช้เซมาฟอร์เพื่อประสานการทำงาน

ตัวอย่าง: การใช้เซมาฟอร์เพื่อประสานการทำงาน

โปรแกรมนี้ใช้เซมาฟอร์เพื่อจัดการการเข้าถึงทรัพยากรที่ใช้ร่วมกัน

#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;
}

แนวทางปฏิบัติที่ดีในการประสานการทำงานของเธรด

แนวทางปฏิบัติที่ดีในการประสานการทำงานของเธรด

เพื่อหลีกเลี่ยงภาวะการแข่งขัน:

  • ใช้มิวเทกซ์เพื่อป้องกันตัวแปรที่ใช้ร่วมกัน
  • ใช้เซมาฟอร์เพื่อจัดการทรัพยากร
  • ลดการใช้ทรัพยากรร่วมกันให้น้อยที่สุดเมื่อทำได้

สรุป

สรุป

ในบทเรียนนี้ คุณได้เรียนรู้:

  • ภาวะการแข่งขันคืออะไรและเกิดขึ้นได้อย่างไร
  • วิธีใช้มิวเทกซ์เพื่อป้องกันภาวะการแข่งขัน
  • เซมาฟอร์ช่วยจัดการการเข้าถึงทรัพยากรที่ใช้ร่วมกันได้อย่างไร

เนื้อหานี้เป็นบทสรุปของส่วนการทำงานหลายเธรดและการทำงานพร้อมกันใน C

การซิงโครไนซ์และภาวะแข่งขัน — ภาพประกอบ 10

คำถามที่พบบ่อย

บทเรียน “การซิงโครไนซ์และภาวะแข่งขัน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การซิงโครไนซ์และภาวะแข่งขัน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C Academy มีบทเรียนทั้งหมด 3 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การซิงโครไนซ์และภาวะแข่งขัน”

นำมิวเทกซ์และเซมาฟอร์มาใช้เพื่อจัดการทรัพยากรที่ใช้ร่วมกันอย่างปลอดภัย คุณปฏิบัติ C Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 3 บทเรียน

บทเรียน “การซิงโครไนซ์และภาวะแข่งขัน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C Academy นี้ได้ไหม

ได้ บทเรียน C Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. แนะนำเธรด
  2. การสร้างและจัดการเธรด
  3. การซิงโครไนซ์และภาวะแข่งขัน
← กลับไปที่ C Academy