العمل مع المواضيع في ج البرمجة يمكن أن تكون مفيدة جدا وفعالة. ومع ذلك ، في بعض الأحيان يصبح من الضروري إنهاء مؤشر ترابط واحد أو أكثر في البرنامج. في هذه المقالة ، سننظر في عدة طرق لإيقاف المواضيع في ج والنظر في مزاياها وعيوبها.
واحدة من أكثر الطرق شيوعا لإنهاء المواضيع في ج هو استخدام العلم. يمكن تعيين العلم في أحد مؤشرات الترابط ، ويمكن للخيوط الأخرى التحقق من قيمتها بشكل دوري. إذا كانت قيمة العلم تشير إلى الحاجة إلى التوقف عن العمل ، يمكن للخيوط إنهاء عملها بشكل صحيح والخروج من الحلقة. هذه الطريقة بسيطة ومباشرة ، ولكن لها عيب واحد-يمكن أن تستمر مؤشرات الترابط في العمل حتى تصل إلى نقطة فحص العلم ، والتي قد تستغرق بعض الوقت وتؤدي إلى تدهور أداء البرنامج.
طريقة أخرى لوقف المواضيع في ج هو استخدام وظيفة بثريد_إلغاء (). تتيح لك هذه الوظيفة مقاطعة تنفيذ مؤشر ترابط محدد عن طريق إرسال إشارة إلغاء إليه. ومع ذلك ، ضع في اعتبارك أن وظيفة بثريد_إلغاء() لا تضمن التوقف الفوري للخيط ، وقد يستغرق الأمر بعض الوقت لإكمال تنفيذه. بالإضافة إلى ذلك ، يمكن أن يؤدي استخدام وظيفة بثريد_إلغاء () إلى تسرب الموارد وانتهاكات اتساق البيانات ، لذلك يجب عليك استخدامها بحذر وفقط في الحالات التي يكون فيها ذلك ضروريا حقا.
- وقف المواضيع في ج: طرق فعالة
- 1. وقف تيارات باستخدام الأعلام
- 2. إيقاف التدفقات باستخدام الإشارات
- 3. إيقاف التدفقات عن طريق الإلغاء
- 4. الانتهاء من البرنامج
- باستخدام وظيفة الخروج ()
- وقف التدفق باستخدام وظيفة بثريد إلغاء()
- باستخدام وظيفة بثريد_كيل () لوقف التدفق
- سؤال وجواب
- كيف يمكنني إيقاف المواضيع في ج?
- كيف يمكنني إيقاف تنفيذ برنامج مؤشرات في ج?
- هل يمكنني قتل موضوع في رمز ج?
- ما هي الطريقة الصحيحة لإنهاء المواضيع في ج?
وقف المواضيع في ج: طرق فعالة
في التطبيقات متعددة مؤشرات الترابط في لغة البرمجة ج ، غالبا ما يكون من الضروري إنهاء مؤشرات الترابط. يمكن أن يكون هذا مفيدا ، على سبيل المثال ، لتجنب تسرب الذاكرة أو إجراء حسابات غير ضرورية. هناك طرق مختلفة لإيقاف التدفقات ، وليست جميعها فعالة في كل موقف. دعونا ننظر إلى بعض منهم.
1. وقف تيارات باستخدام الأعلام
واحدة من أسهل الطرق لوقف المواضيع هو استخدام الأعلام. يتم تعيين علامة في مؤشر الترابط الرئيسي أو في مؤشر ترابط آخر ، وتتحقق مؤشرات الترابط بشكل دوري من قيمتها وتتوقف إذا لزم الأمر. يمكن تنفيذ ذلك باستخدام المتغيرات الشرطية أو المزامنة.
ومع ذلك ، هذه الطريقة ليست فعالة دائما. إذا كان مؤشر الترابط يقوم بعمليات حسابية بشكل متكرر أو تم حظره عند الإدخال/الإخراج ، فقد يكون الوقت المستغرق في التحقق من العلامة كبيرا. بالإضافة إلى ذلك ، لا تضمن هذه الطريقة توقفا فوريا للتيار وقد تؤدي إلى انتظار اكتمال العمليات الحسابية أو عمليات الإدخال/الإخراج.
2. إيقاف التدفقات باستخدام الإشارات
طريقة أخرى لوقف المواضيع هي استخدام الإشارات. يمكن أن يرسل مؤشر الترابط الرئيسي إشارات إلى مؤشر ترابط معين أو مجموعة من مؤشرات الترابط ، والتي يجب عليها بعد ذلك معالجة هذه الإشارات وإكمال عملها. يمكن إرسال الإشارات باستخدام وظيفة بثريد_كيل أو عن طريق تعيين معالج إشارة باستخدام وظيفة الإشارة.
ومع ذلك ، فإن استخدام الإشارات لإيقاف التدفقات له حدوده أيضا. على سبيل المثال ، لا تدعم جميع أنظمة التشغيل إشارات مؤشرات الترابط الفردية ، وبدلا من ذلك تستخدم الإشارات للعملية بأكملها. بالإضافة إلى ذلك ، لا يمكن استدعاء معالج الإشارة إلا في نقاط معينة في تنفيذ مؤشر الترابط ، مما قد يجعل من الصعب إيقاف تشغيل مؤشر الترابط بشكل صحيح.
3. إيقاف التدفقات عن طريق الإلغاء
طريقة أخرى لإنهاء المواضيع هي الإلغاء. يمكن أن يرسل مؤشر الترابط الرئيسي إشارة إلغاء إلى مؤشر ترابط معين باستخدام وظيفة بثريد_إلغاء. يجب تكوين مؤشر الترابط الذي يتلقى إشارة الإلغاء للإلغاء باستخدام وظيفة بثريد سيتكانسيلستات. يجب أن يتحقق مؤشر الترابط بعد ذلك من حالة الإلغاء باستخدام وظيفة بثريد_تيستكانسيل وإنهاء عملها إذا لزم الأمر.
ومع ذلك ، فإن هذه الطريقة لها أيضا عيوبها. يمكن أن يؤدي الاستخدام غير المنضبط للإلغاء إلى سلوك غير متوقع أو تسرب للموارد. بالإضافة إلى ذلك ، لا تدعم جميع الوظائف الإلغاء ، لذلك يمكن أن يتوقف مؤشر الترابط فقط عند نقاط تنفيذ معينة.
4. الانتهاء من البرنامج
إذا لم يكن إيقاف سلاسل الرسائل حرجا أو مستحيلا في موقف معين ، فيمكنك ببساطة إنهاء البرنامج. سيؤدي هذا تلقائيا إلى إنهاء جميع سلاسل الرسائل. ومع ذلك ، يجب النظر بعناية في استخدام هذه الطريقة ويجب مراعاة العواقب المحتملة ، خاصة إذا تم تنفيذ عمليات طويلة الأجل أو العمل مع الموارد الخارجية في البرنامج.
أخيرا ، يمكن إجراء إنهاء الخيط في تطبيقات ج متعددة مؤشرات الترابط باستخدام العلامات أو الإشارات أو الإلغاءات أو ببساطة عن طريق إنهاء البرنامج. كل طريقة من هذه الطرق لها مزاياها وعيوبها ، ويعتمد اختيار طريقة معينة على الموقف المحدد ومتطلبات التطبيق.
باستخدام وظيفة الخروج ()
وظيفة الخروج () هي جزء من مكتبة سي القياسية وتستخدم لإنهاء البرنامج على الفور. يمكن أن يكون هذا مفيدا عندما يكون من الضروري إيقاف تنفيذ برنامج في موقف معين أو عند حدوث خطأ.
يبدو بناء جملة وظيفة الخروج () كما يلي:
خروج باطل (حالة كثافة العمليات);
وسيطة الحالة هي رمز إنهاء البرنامج الذي يمكن استخدامه لنقل معلومات الخطأ أو معلومات أخرى إلى نظام التشغيل.
عند استدعاء وظيفة الخروج () ، يتم تنفيذ الإجراءات التالية:
- يتم تنفيذ جميع عمليات دمج الخيط الداخلي (التدفق)
- يتم حظر جميع تدفقات الإدخال / الإخراج القياسية
- معالجات مسجلة من وظيفة أتيكسيت()
- يتم تنفيذ معالجات مسجلة من أون_كسيت()
- يتم تنفيذ وظيفة يتم الانتهاء من الكائنات الثابتة
- يتم استدعاء الدالة _ خروج () مع قيمة الحالة التي تم تمريرها
يمكن أن تأخذ قيمة الحالة عند استدعاء دالة الخروج() قيما مختلفة ، ولكن عادة ما يتم استخدام القيم التالية:
- 0-الانتهاء بنجاح من البرنامج
- 1-خطأ أو إنهاء غير صحيح للبرنامج
من المهم ملاحظة أن وظيفة الخروج () لا تعيد التحكم إلى برنامج الاتصال ، ولكنها تنهيه على الفور. لذلك ، لن يتم تنفيذ جميع التعليمات البرمجية التالية لاستدعاء وظيفة الخروج ().
مثال على استخدام وظيفة الخروج() :
# تشمل
# تشمل
كثافة العمليات الرئيسية () {
عدد الأسطوانات;
برينتف ("أدخل رقم:");
المسح الضوئي ("٪د"،#);
إذا (الأسطوانات < 0) {
برينتف ("خطأ: تم إدخال الرقم السالب
");
خروج (1);
}
برينتف ("لقد دخلت: ٪ د
"،الأسطوانات);
العودة 0;
}
في هذا المثال ، إذا قام المستخدم بإدخال رقم سالب ، يقوم البرنامج بإخراج رسالة خطأ واستدعاء وظيفة الخروج () مع الوسيطة 1. نتيجة لذلك ، ينتهي البرنامج برمز خطأ. إذا قام المستخدم بإدخال رقم موجب ، يقوم البرنامج بإخراج الرقم الذي تم إدخاله وينتهي برمز النجاح (0).
إيقاف مؤشر ترابط باستخدام الدالة بثريد_إلغاء ()
في البرمجة متعددة مؤشرات الترابط ، ينشأ موقف عندما يحتاج أحد مؤشرات الترابط إلى المقاطعة. للقيام بذلك ، يمكنك استخدام وظيفة بثريد_إلغاء () من مكتبة بثريدس في اللغة ج.
تسمح لك وظيفة بثريد_إلغاء () بإرسال طلب لمقاطعة الدفق المحدد. يمكن أن يحدث انقطاع في أي وقت في تنفيذ مؤشر ترابط ، ولكن اللحظة الدقيقة تعتمد على تنفيذ نظام التشغيل.
لاستخدام وظيفة بثريد_إلغاء () ، يجب أن يكون لديك معرف تيار ، والتي يمكن الحصول عليها باستخدام وظيفة بثريد_سيلف ().
مثال على استخدام الدالة بثريد_إلغاء () يبدو مثل هذا:
# تشمل
# تشمل
# تشمل
فواد * ثرياد_فونك (فواد* أرغ) {
بينما (1) {
برينتف ("الموضوع قيد التشغيل
");
}
}
كثافة العمليات الرئيسية () {
ثريد_ت ثريد_د;
ثريد_خلق (&ثريد_د ، نول ، ثريد_فونك ، نول);
// Ждем, пока поток выполнит некоторую работу
النوم (2);
// Отменяем поток
ثريد_إلغاء (ثريد_إلغاء);
ثريد_جوين (ثريد_د ، نول);
العودة 0;
}
Thread ، thread "الخيط قيد التشغيل". بعد القيام ببعض الأعمال ، يستدعي مؤشر الترابط الرئيسي الدالة بثريد_إلغاء() لمقاطعة مؤشر الترابط. ثم ، باستخدام وظيفة بثريد_جوين () ، من المتوقع أن ينتهي مؤشر الترابط.
من المهم ملاحظة أن وظيفة بثريد_إلغاء () ترسل ببساطة طلبا لمقاطعة مؤشر الترابط ، ولكنها لا تضمن توقف مؤشر الترابط عن العمل على الفور. يجب أن يعالج مؤشر الترابط طلب المقاطعة بشكل مستقل باستخدام الدالة بثريد_تيستكانسيل ().
باستخدام وظيفة بثريد_كيل () لإيقاف مؤشر الترابط
وظيفة بثريد_كيل () يسمح لك لوقف تنفيذ تيار عن طريق تحديد معرف والإشارة التي سيتم إرسالها.
بناء جملة الدالة هو كما يلي:
إنت بثراد_كيل (بثراد_ت الموضوع، إنت سيغ);
أين:
- - معرف الدفق لإرسال الإشارة إلى;
- هي قيمة عدد صحيح تشير إلى الإشارة المراد إرسالها.
وظيفة بثريد_كيل() يرسل إشارة محددة إلى مؤشر الترابط المحدد. إذا لم يتم العثور على الدفق أو تعذر إرسال الإشارة ، تقوم الدالة بإرجاع خطأ.
Пример использования:
# تشمل
# تشمل
# تشمل
فواد * ثرياد_فونكتيون (فواد * أرغ)
{
بينما (1)
{
// выполняем какую-то работу
}
بثريد_خروج (نول);
}
كثافة العمليات الرئيسية()
{
بثريد_ت الموضوع;
مركز كثافة العمليات;
// создаем поток
الحالة = بثريد_إنشاء (وخيط ، نول ، ثريد_وظيفة ، نول);
إذا (الحالة != 0)
{
برينتف ("خطأ في إنشاء مؤشر ترابط!
");
خروج (1);
}
// через некоторое время останавливаем поток
النوم (5);
ثريد_كيل (الموضوع ، سيجينت);
// ждем завершения потока
بثريد_الانضمام (الموضوع ، لاغية);
العودة 0;
}
في هذا المثال ، نقوم بإنشاء مؤشر ترابط جديد باستخدام الدالة بثريد_إنشاء (). بعد ذلك ، نوقف تنفيذ الخيط الرئيسي لمدة 5 ثوان باستخدام وظيفة السكون (). ثم ، باستخدام وظيفة بثريد_كيل () ، نرسل إشارة سيجنت إلى تيار لإيقافه. بعد ذلك ، ننتظر حتى ينتهي مؤشر الترابط باستخدام وظيفة بثريد_جوين ().
من المهم ملاحظة أن وظيفة بثريد_كيل () ترسل ببساطة إشارة إلى الدفق المحدد ، ولكنها لا تضمن توقفها الفوري. يمكن أن يؤدي استخدام هذه الوظيفة إلى عواقب غير مرغوب فيها ، لذلك من الضروري استخدامها بحذر وفقط عند الضرورة القصوى.
سؤال وجواب
كيف يمكنني إيقاف المواضيع في ج?
لا توجد آلية مدمجة في ج لإنهاء الخيوط. ومع ذلك ، يمكنك استخدام العلامات أو المتغيرات للتحكم في تشغيل مؤشرات الترابط. على سبيل المثال ، يمكنك تعيين علامة والتحقق من قيمتها في حلقة تنفيذ مؤشر الترابط. إذا تم تعيين العلم ، يمكن للخيط إنهاء عمله.
كيف يمكنني إيقاف تنفيذ برنامج مؤشرات في ج?
في برامج سي متعددة مؤشرات الترابط ، لا توجد طريقة سهلة لإيقاف التنفيذ. ينفذ كل مؤشر ترابط تعليماته الخاصة ، ويمكن أن يكون إيقاف جميع مؤشرات الترابط مهمة صعبة. ومع ذلك ، يمكنك استخدام متغيرات المزامنة ، مثل المزامنة أو المتغيرات الشرطية. عند تعيين علامة أو تغيير قيمة متغير ، يمكن لجميع مؤشرات الترابط التحقق من هذا الشرط وإكمال عملها.
هل يمكنني قتل موضوع في رمز ج?
بقدر ما أعرف ، لا توجد وظيفة في مكتبة ج القياسية لتدمير تيار مباشرة. يمكن أن تؤدي محاولة " قتل " مؤشر ترابط إلى سلوك برنامج غير محدد. من الأفضل استخدام طرق أخرى ، مثل تعيين العلامات أو المتغيرات للتحكم في تشغيل مؤشرات الترابط.
ما هي الطريقة الصحيحة لإنهاء المواضيع في ج?
الطريقة الصحيحة لإنهاء المواضيع في ج قد تعتمد على متطلبات وهيكل البرنامج الخاص بك. نهج واحد هو استخدام الأعلام أو المتغيرات للسيطرة على تشغيل المواضيع. يمكنك تعيين علامة على قيمة تشير إلى مؤشرات الترابط لإيقاف التشغيل ، والتحقق من هذه القيمة في دورة تنفيذ مؤشر الترابط. إذا تم تعيين العلم ، يمكن للخيط إنهاء عمله. يمكنك أيضا استخدام وظيفة بثريد_إلغاء في بوسيكس لمقاطعة تنفيذ مؤشر ترابط معين ، ولكنه لا يضمن التوقف الفوري لمؤشر الترابط وقد يكون له سلوك غير محدد. على أي حال ، من المهم تنظيم التحكم في عمل الخيوط بشكل صحيح لتجنب مشاكل المزامنة والاعتماد على تطبيقات معينة.