0Pricing
C Academy · درس

المزامنة وظروف التسابق

طبّقوا كائنات mutex والإشارات semaphore لإدارة الموارد المشتركة بأمان

المزامنة وظروف التسابق درس مجاني في C Academy على CoddyKit. هذا هو الدرس 3 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C Academy 3 دروس في المجموع.

المزامنة وظروف التنافس

المزامنة وظروف التنافس

عندما تصل عدة خيوط إلى موارد مشتركة، قد تحدث ظروف تنافس، مما يؤدي إلى نتائج غير متوقعة.

في هذا الدرس، ستتعلمون:

  • ما ظروف التنافس وكيف تحدث.
  • كيفية استخدام كائنات mutex لمنع ظروف التنافس.
  • كيفية مساعدة إشارات semaphore في إدارة الموارد المشتركة.
المزامنة وظروف التسابق — رسم توضيحي 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;
}

منع حالات التنافس باستخدام mutex

منع حالات التنافس باستخدام mutex

يضمن mutex (الاستبعاد المتبادل) وصول خيط واحد فقط إلى المورد في كل مرة.

دوال mutex:

  • pthread_mutex_init() - تهيّئ mutex.
  • pthread_mutex_lock() - تقفل mutex.
  • pthread_mutex_unlock() - تفتح قفل mutex.
  • pthread_mutex_destroy() - تتلف mutex.

مثال: استخدام mutex لمنع حالات التنافس

مثال: استخدام mutex لمنع حالات التنافس

يصلح هذا البرنامج حالة التنافس باستخدام mutex للتحكم في الوصول إلى العداد المشترك.

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

ما إشارة semaphore؟

ما إشارة semaphore؟

إشارة semaphore هي عداد يُستخدم للتحكم في الوصول إلى الموارد.

الدوال الرئيسية:

  • sem_init() - تهيّئ إشارة semaphore.
  • sem_wait() - تُنقص قيمة إشارة semaphore.
  • sem_post() - تزيد قيمة إشارة semaphore.
  • sem_destroy() - تتلف إشارة semaphore.

مثال: استخدام إشارات semaphore للمزامنة

مثال: استخدام إشارات semaphore للمزامنة

يستخدم هذا البرنامج إشارة semaphore لإدارة الوصول إلى مورد مشترك.

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

أفضل الممارسات لمزامنة الخيوط

أفضل الممارسات لمزامنة الخيوط

لتجنب حالات التنافس:

  • استخدموا كائنات mutex لحماية المتغيرات المشتركة.
  • استخدموا إشارات semaphore لإدارة الموارد.
  • قللوا استخدام الموارد المشتركة حيثما أمكن.

الملخص

الملخص

في هذا الدرس، تعلمتم:

  • ما ظروف التنافس وكيف تحدث.
  • كيفية استخدام كائنات mutex لمنع حالات التنافس.
  • كيفية مساعدة إشارات semaphore في إدارة الوصول إلى الموارد المشتركة.

بهذا يختتم قسم تعدد الخيوط والتزامن في C!

المزامنة وظروف التسابق — رسم توضيحي 10

الأسئلة الشائعة

هل درس «المزامنة وظروف التسابق» مجاني؟

نعم — نص درس «المزامنة وظروف التسابق» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C Academy 3 دروس في المجموع.

ماذا ستتعلم في «المزامنة وظروف التسابق»؟

طبّقوا كائنات mutex والإشارات semaphore لإدارة الموارد المشتركة بأمان تتمرن على C Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C Academy؟

لا تُشترط خبرة سابقة. C Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 3.

كم من الوقت يستغرق درس «المزامنة وظروف التسابق»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C Academy هذا؟

نعم. كل درس في C Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مقدمة إلى الخيوط
  2. إنشاء الخيوط وإدارتها
  3. المزامنة وظروف التسابق
← العودة إلى C Academy