البرمجة

تحسين إنشاء المواضيع متعددة الخيوط في لغة البرمجة C

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

قد يكون السبب وراء عدم فرادى هوية المواضيع هو أن الدالة syscall(SYS_gettid) تعيد هوية الموضوع الرئيسية (PID) بدلاً من الهوية الفرعية (TID). في نظام Linux، يتم استخدام syscall(SYS_gettid) للحصول على هوية الموضوع الرئيسية، وليس الفرعية. للحصول على هوية الموضوع الفرعية، يمكن استخدام pthread_self().

لذا، يمكن تعديل الكود كما يلي:

c
char **filenames; int file_cnt; DIR *dir; void* process_file(void *filename) { long tid; tid = syscall(SYS_gettid); // يمكن استخدام pthread_self() للحصول على هوية الموضوع الفرعية printf("Processing file: %s, Thread ID: %ld\n", (char*)filename, tid); // اكمل المعالجة الخاصة بالملف هنا pthread_exit(NULL); } int main(int argc, char *argv[]) { int i; pthread_t file[file_cnt]; get_filenames(); // الحصول على اسماء الملفات في الدليل الحالي printf("There are %d files:\n", file_cnt); for(i = 0; i < file_cnt; i++) { printf("%s\n", filenames[i]); pthread_create(&file[i], NULL, process_file, (void *)filenames[i]); } // انتظر اكتمال جميع المواضيع for(i = 0; i < file_cnt; i++) { pthread_join(file[i], NULL); } return EXIT_SUCCESS; }

تم استبدال الدالة gettid() بـ pthread_self() في داخل دالة المعالجة process_file للحصول على هوية الموضوع الفرعية. تم تعديل دالة الإنشاء لتستخدم الدالة الجديدة process_file وتم إضافة دالة pthread_join للانتظار حتى اكتمال جميع المواضيع.

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

بالطبع، دعونا نوسع المناقشة حول بعض النقاط المهمة في الكود والتحسينات الممكنة:

  1. تجنب المتغيرات العالمية:
    في الكود الحالي، تستخدم متغيرات مثل filenames و file_cnt كمتغيرات عالمية، يمكن النظر في تحديدها بشكل أفضل. يفضل تمريرها كمعاملات للدوال بدلاً من الاعتماد على المتغيرات العالمية.

  2. التحقق من نجاح إنشاء المواضيع:
    يفضل دائمًا التحقق من نجاح إنشاء المواضيع باستخدام pthread_create. في حالة فشل الإنشاء، يمكنك اتخاذ إجراءات مناسبة مثل إصدار رسالة خطأ.

  3. التحكم في توازن الأحمال:
    قد يكون هناك تحدي في توازن الأحمال عند إنشاء عدة مواضيع لمعالجة الملفات. يمكن أن يؤدي توزيع غير فعال للمواضيع إلى تأثير سلبي على أداء التطبيق. يمكنك النظر في تحسين توزيع المواضيع لتحقيق أفضل أداء.

  4. تجنب تسجيل الناتج في stdout:
    تسجيل الناتج في stdout يمكن أن يؤدي إلى اختلاط الناتج في بيئات متعددة المواضيع. يمكن أن يكون من الأفضل استخدام نظام تسجيل منفصل أو تنظيم الناتج بشكل جيد لتجنب الالتباس.

  5. التعامل مع الإغلاق السليم:
    يفضل إضافة معالج للخروج (atexit) لضمان الإغلاق السليم للموارد. يمكن أن يكون هذا مفيدًا لتجنب تسريب الذاكرة أو مشاكل أخرى.

  6. استخدام دوال الـ C99:
    يمكن استخدام دوال C99 المتقدمة، مثل snprintf بدلاً من printf لتجنب مشاكل الفورمات وتحسين السلامة.

  7. التعامل مع الأخطاء:
    قد تكون هناك حاجة إلى تحسين التعامل مع الأخطاء. يمكنك استخدام perror لطباعة رسالة الخطأ في حالة حدوث خطأ في pthread_create، مما يجعلها أكثر إيضاحًا.

  8. التعامل مع الملفات:
    يفضل التأكد من أنك تقوم بإغلاق الملفات بشكل صحيح بعد الانتهاء من استخدامها، لتجنب تسريب الموارد.

هذه بعض التحسينات الممكنة والنقاط التي يمكن النظر فيها لتحسين الأداء والكفاءة في الكود المقدم.

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

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

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

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