البرمجة

تنفيذ متعدد المواضيع في C: سلسلة Fibonacci

موضوع البرمجة متعلق بتنفيذ متعدد المواضيع في لغة C لإنشاء سلسلة Fibonacci يعتبر واحدًا من الأمور المثيرة للاهتمام في علم نظم التشغيل. عند بدء البرمجة في هذا المجال، قد تواجه تحديات في تصميم وتنفيذ البرنامج بشكل صحيح. سأقوم بشرح بعض الأفكار والتغييرات التي يمكن إجراؤها في الكود لحل المشكلات التي تواجهك.

أولًا، دعني أوضح الخطأ الرئيسي في الكود الحالي. عند استدعاء الدالة fibonacci في كل خيط، يتم تمرير threadCount بدلاً من القيمة الفعلية للمصطلح في سلسلة Fibonacci. يجب استخدام القيمة المحددة لكل خيط في حساب السلسلة بدلاً من threadCount.

لحل هذه المشكلة، يمكن تغيير الكود بحيث يقوم كل خيط بحساب مصطلح واحد فقط في سلسلة Fibonacci بناءً على تعداد الخيوط. فيما يلي تعديلات على الكود:

c
#include #include #include int total = 0; typedef struct { int start; int end; int threadNo; } THREAD_PARAMETERS; void *work(void *parameters); int threadCount; int main(int argc, char *argv[]) { printf("Please enter the number of terms you want to display: "); scanf("%d", &threadCount); pthread_t tid[threadCount]; pthread_attr_t attr[threadCount]; THREAD_PARAMETERS *lpParameter; lpParameter = malloc(sizeof(THREAD_PARAMETERS) * threadCount); int i; for (i = 0; i < threadCount; i++) { lpParameter[i].start = i; // Start from the current thread number lpParameter[i].end = i + 1; // End at the next term lpParameter[i].threadNo = i + 1; pthread_attr_init(&attr[i]); pthread_create(&tid[i], &attr[i], work, &lpParameter[i]); } for (i = 0; i < threadCount; i++) { pthread_join(tid[i], NULL); } return 0; } void fibonacci(int n) { int prev_term = 0, current_term = 1, next_term, i; for (i = 0; i < n; i++) { printf("%d\n", prev_term); next_term = current_term + prev_term; prev_term = current_term; current_term = next_term; } } void *work(void *parameters) { THREAD_PARAMETERS *param = (THREAD_PARAMETERS *) parameters; int terms_to_calculate = param->end - param->start; // Calculate the number of terms for this thread fibonacci(terms_to_calculate); pthread_exit(0); }

بهذه الطريقة، يقوم كل خيط بحساب مجموعة من المصطلحات في سلسلة Fibonacci بدلاً من حساب كامل السلسلة. يتم تقسيم العمل بين الخيوط بحيث يحسب كل خيط فقط المصطلحات التي تناسبها ويطبعها.

هذه الطريقة تجعل البرنامج أكثر كفاءة وتوازنًا بين الخيوط، حيث يتم تخفيف الضغط على الموارد وتقليل الاحتمالات المتعلقة بالسباقة (Race Conditions) والانتظار النشط (Busy Waiting).

المزيد من المعلومات

بالطبع، سأقوم بمتابعة الشرح واستكمال المقال بمزيد من التفاصيل والشروحات.

يعتمد تصميم البرنامج على مفهوم التوزيع لحساب السلسلة، حيث يتم تعيين كل خيط لحساب مجموعة من المصطلحات مستقلة عن الآخرين. هذا التوزيع يزيد من كفاءة البرنامج ويسمح بتوازن الحمل بين الخيوط.

عند تشغيل البرنامج، يُطلب من المستخدم إدخال عدد المصطلحات التي يرغب في عرضها. يتم استخدام هذا العدد لتحديد عدد الخيوط التي ستنشأ، وتقسيم عملية حساب السلسلة بين هذه الخيوط.

ثم يتم إنشاء الخيوط بشكل موازٍ باستخدام دالة pthread_create، حيث يتم تمرير معلمة من نوع THREAD_PARAMETERS إلى كل خيط. تحتوي هذه المعلمة على المعلومات اللازمة لكل خيط، مثل النطاق الذي يجب حساب المصطلحات ضمنه.

في دالة work، التي تُنفذ بواسطة كل خيط، يتم استخراج المعلمات من المعلمة الممررة واستخدامها لحساب عدد معين من المصطلحات في السلسلة. بعد ذلك، يتم استدعاء دالة fibonacci لحساب هذه المصطلحات وطباعتها.

تعمل دالة fibonacci على حساب المصطلحات باستخدام خوارزمية Fibonacci الشهيرة. تبدأ الخوارزمية بمصطلحين أوليين وتقوم بحساب المصطلحات اللاحقة باستخدام قيم المصطلحين السابقين.

بعد انتهاء كل خيط من حساب وطباعة المصطلحات المخصصة له، ينتهي البرنامج من خلال استدعاء pthread_join لكل خيط، مما يضمن انتظار انتهاء تنفيذ كل خيط قبل انتهاء تنفيذ البرنامج بشكل كامل.

تمثل هذه الطريقة تنفيذًا فعالًا ومتوازنًا لحساب سلسلة Fibonacci باستخدام متعدد المواضيع في لغة C، مما يسمح بتحسين أداء البرنامج واستخدام الموارد بشكل أكثر فعالية.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر