تيارات في ج هي وسيلة مريحة للعمل مع إدخال البيانات والمخرجات. أنها تسمح للبرامج بالتفاعل مع العالم الخارجي وتبادل المعلومات. في ج ، التدفقات عبارة عن تجريد ، وهو عبارة عن سلسلة من وحدات البايت التي يمكن قراءتها أو كتابتها. للعمل مع التدفقات في ج ، يتم استخدام وظائف من المكتبة القياسية.
هناك ثلاثة تيارات محددة مسبقا في ج: ستدين ، ستدوت ، و ستدير. يستخدم ستدين (تيار الإدخال القياسي) لقراءة البيانات من مصادر خارجية ، على سبيل المثال ، من لوحة المفاتيح. ستدوت (تيار الإخراج القياسي) يستخدم لإخراج البيانات ، على سبيل المثال ، إلى شاشة أو إلى ملف. ستدير (تيار الخطأ القياسي) يستخدم لإخراج رسائل الخطأ.
مثال على العمل مع التدفقات في ج يمكن أن يكون برنامجا يقرأ رقما ، ويضربه في 2 ، ثم يعرض النتيجة على الشاشة. سيقوم البرنامج باستخدام ستدين و ستدوت تيارات. أولا ، يقرأ الرقم باستخدام وظيفة المسح الضوئي () ، ثم يضربها في 2 ويخرج النتيجة باستخدام وظيفة برينتف ().
في هذا المثال ، نستخدم تيار ستدين لقراءة الرقم باستخدام وظيفة المسح الضوئي (). بعد ذلك ، نقوم بضرب هذا الرقم في 2 وإخراج النتيجة إلى تيار ستدوت باستخدام وظيفة برينتف (). وبالتالي ، فإننا نتفاعل بنجاح مع العالم الخارجي باستخدام التدفقات في ج.
- التدفق في ج: المفاهيم الأساسية
- كيفية إنشاء وتشغيل تيار
- تنظيم التفاعل بين المواضيع
- تزامن تيارات
- نقل البيانات بين التدفقات
- مثال على استخدام التدفقات
- التزامن وتعدد مؤشرات الترابط
- أمثلة على استخدام التدفقات في ج
- سؤال وجواب
- ما هو تيار?
- كيف يمكنني إنشاء تيار في ج?
- ما هي العمليات التي يمكن القيام بها على تيار في ج?
التدفق في ج: المفاهيم الأساسية
في ج ، تستخدم التدفقات لإدخال البيانات وإخراجها. التدفقات هي تجريدات تمثل تدفقات متسلسلة من البايتات يمكن للبرنامج من خلالها تبادل المعلومات مع البيئة الخارجية أو البرامج الأخرى.
هناك ثلاثة تدفقات إدخال/إخراج قياسية في ج:
- ستدين هو تيار الإدخال القياسية التي يتم استخدامها لقراءة البيانات من لوحة المفاتيح أو جهاز الإدخال الأخرى.
- ستدوت هو تيار الإخراج القياسية التي يتم استخدامها لإخراج البيانات إلى شاشة أو جهاز الإخراج الأخرى.
- ستدير هو تيار إخراج خطأ قياسي يستخدم لإخراج رسائل الخطأ ومعلومات التصحيح.
تسمح التدفقات للبرنامج بالتفاعل مع المستخدم وتلقي البيانات من الملفات وعرض نتائج العمل على الشاشة وغير ذلك الكثير.
للعمل مع تيارات الإدخال / الإخراج في ج ، وظائف من المكتبة القياسية (ستديو.ح) تستخدم. على سبيل المثال ، يتم استخدام وظيفة المسح الضوئي لقراءة البيانات من دفق الإدخال ، ويتم استخدام وظيفة الطباعة لإخراج البيانات إلى دفق الإخراج.
يمكن توجيه التدفقات إلى أجهزة إدخال / إخراج مختلفة مثل لوحة المفاتيح أو الملفات أو اتصالات الشبكة. بمساعدة الوظائف الخاصة ، يمكنك أيضا إنشاء تدفقات مخصصة والعمل معها وإعادة توجيهها في اتجاهات مختلفة.
الاستخدام الفعال للتيارات في ج يجعل البرامج أكثر مرونة ، وحدات ، ويجعل من السهل تغيير الإدخال / الإخراج اعتمادا على احتياجات التطبيق.
كيفية إنشاء وتشغيل تيار
في البرمجة ، الدفق هو تسلسل مستقل للتعليمات القابلة للتنفيذ. يتم إنشاء وتشغيل دفق في ج باستخدام مكتبة بثريد. للقيام بذلك ، اتبع الخطوات التالية:
- قم بتضمين ملف الرأس بثريد.ح: # تشمل .
- حدد الوظيفة التي ستكون نقطة الدخول إلى الدفق. عادة ما تحتوي هذه الوظيفة على التنسيق التالي: باطل * اسم الوظيفة (باطل * معلمة). هنا ، يمكن أن تكون المعلمة أي نوع من البيانات أو مؤشر للبيانات التي يتم تمريرها إلى الدفق. يجب أن تؤدي الوظيفة منطق التدفق الأساسي.
- في البرنامج الرئيسي ، قم بإنشاء متغير من النوع بثريد_ت ، والذي سيكون معرف البث: معرف بثريد_ت؛.
- استخدم الدالة بثريد_إنشاء لإنشاء دفق. تقبل الدالة عنوان متغير معرف الدفق ، بالإضافة إلى معلمات أخرى مثل سمات الدفق ووظيفة نقطة الدخول: بثريد_إنشاء(&معرف الدفق ، نول ، اسم الدالة ، المعلمة)؛.
- تحقق من نجاح إنشاء دفق. إذا كانت الدالة بثريد_إنشاء بإرجاع قيمة فارغة ، ثم تم إنشاء مؤشر الترابط بنجاح. خلاف ذلك ، حدث خطأ.
- استخدم وظيفة بثريد_جوين لانتظار اكتمال مؤشر الترابط. تقبل الدالة معرف الدفق والمؤشر حيث سيتم حفظ نتيجة تنفيذ الدفق: بثريد_جوين(معرف الدفق ، فارغ)؛.
مثال على إنشاء وتشغيل دفق:
# تشمل
# تشمل
باطل * ميثريادفونكتيون (باطل * أرغ)
{
إنت ثريدنومبر = *((إنت*) أرغ);
برينتف ("مرحبا من الموضوع ٪ د
"،رقم الخيط);
بثريد_خروج (نول);
}
كثافة العمليات الرئيسية()
{
بثريد_ت الموضوع;
إنت ثريدنومبر = 1;
نتيجة كثافة العمليات;
// Создание потока
النتيجة = بثريد_إنشاء (وخيط ، نول، ميثريدفونكتيون ،و ثريدنومبر);
إذا (نتيجة != 0)
{
برينتف ("خطأ في إنشاء مؤشر ترابط
");
عودة 1;
}
// Ожидание завершения потока
بثريد_الانضمام (الموضوع ، لاغية);
العودة 0;
}
Hello ، hello "مرحبا من الموضوع"،.. في البرنامج الرئيسي ، يتم إنشاء متغير مؤشر الترابط ، ومعرف مؤشر الترابط ، بالإضافة إلى متغير رقم الخيط ، وهي معلمة يتم تمريرها إلى الدفق.
تنظيم التفاعل بين المواضيع
في البرمجة ، غالبا ما تستخدم مؤشرات الترابط لتنظيم التنفيذ المتوازي للمهام. ومع ذلك ، غالبا ما تكون هناك حاجة للتفاعل بين مؤشرات الترابط لنقل البيانات أو مزامنة التنفيذ.
تزامن تيارات
هناك حاجة إلى مزامنة مؤشر الترابط لتنظيم ومراقبة تنفيذ المهام من خلال مؤشرات ترابط متعددة. تتضمن طرق المزامنة الرئيسية استخدام كائنات المزامنة والمتغيرات الشرطية والإشارات.
- المزامنة تسمح المواضيع متعددة لمزامنة الوصول إلى البيانات المشتركة. قد يتم احتلال المزامنة بواسطة مؤشر ترابط واحد ، وسيتعين على مؤشرات الترابط الأخرى الانتظار حتى يتم تحرير المزامنة.
- تسمح المتغيرات الشرطية لمؤشرات الترابط بانتظار استيفاء حدث أو شرط معين قبل متابعة التنفيذ. إنها تسمح لك بتنفيذ آليات مزامنة أكثر تعقيدا ، مثل المنتج والمستهلك أو القارئ والكاتب.
- تسمح لك الإشارات بتحديد الوصول إلى مورد لعدد محدد من سلاسل الرسائل. يمكن أن تحتوي الإشارة على عداد يتم زيادته أو تقليصه بواسطة مؤشرات الترابط للتحكم في الوصول.
نقل البيانات بين التدفقات
يمكن أن يحدث نقل البيانات بين سلاسل الرسائل من خلال المتغيرات المشتركة أو استخدام قوائم انتظار الرسائل.
- يمكن استخدام المتغيرات المشتركة لنقل البيانات بين مؤشرات الترابط. ومع ذلك ، فإن مزامنة الوصول إلى المتغيرات المشتركة ضرورية لتجنب حالة السباق.
- تسمح قوائم انتظار الرسائل لمؤشر ترابط واحد بقائمة انتظار الرسائل ومؤشر ترابط آخر لاسترجاعها. يتيح لك ذلك نقل البيانات بشكل آمن بين سلاسل الرسائل دون الحاجة إلى مزامنة صريحة.
مثال على استخدام التدفقات
لنلق نظرة على مثال لاستخدام مؤشرات الترابط لحساب مجموع المتجه بالتوازي.
# تشمل
# تشمل
# تشمل
# تحديد نوم_المواضيع 4
مجموع كثافة العمليات = 0;
ناقلات كثافة العمليات[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
حجم المتجه الدولي = حجم (متجه) / حجم (متجه [0]);
فواد * سوم _ ثريد (فواد *أرغ) {
إنت تيد = *((إنت*)أرغ);
إنت ستارت = تيد * (متجه_الحجم / نوم_المواضيع);
إنت إند = (تيد + 1) * (متجه_الحجم / نوم_المواضيع);
ل (إنت أنا = بداية ؛ أنا < نهاية ؛ أنا i) {
مجموع + = متجه [أنا];
}
العودة فارغة;
}
كثافة العمليات الرئيسية () {
ثريد_ت المواضيع [نوم_ثريدس];
إنت ثريددسدس [نوم_ثريدس];
ل (إنت أنا = 0 ؛ أنا < نوم_ثريدس ؛ أنا i) {
[أنا] = أنا;
ثريد_إنشاء (&المواضيع [أنا] ، نول ، سوم-ثريد ، & ثريد_دس [أنا]);
}
ل (إنت أنا = 0 ؛ أنا < نوم_ثريدس ؛ أنا i) {
بثريد_جوين (المواضيع [أنا] ، لاغية);
}
برينتف ("المجموع: ٪ د
"،مجموع);
العودة 0;
}
في هذا المثال ، نقوم بإنشاء 4 مؤشرات ترابط يحسب كل منها مجموع الجزء الخاص به من المتجه. ثم ننتظر كل مؤشر ترابط لإكمال وإخراج المبلغ الإجمالي.
وبالتالي ، فإن تنظيم التفاعل بين الخيوط هو جانب مهم عند استخدام البرمجة المتوازية. تتيح مزامنة التدفقات ونقل البيانات بينهما الاستخدام الفعال لموارد الحوسبة وتحسين أداء البرنامج.
التزامن وتعدد مؤشرات الترابط
ج لديه دعم للعمل مع المواضيع وتعدد مؤشرات الترابط ، والذي يسمح لك بحل المهام بالتوازي. ومع ذلك ، عند العمل مع مؤشرات ترابط متعددة ، قد تكون هناك مشكلة في مزامنة الوصول إلى الموارد المشتركة. تتوفر أدوات المزامنة المختلفة لمنع التعارضات وضمان التشغيل الصحيح للخيوط.
يمكن إجراء مزامنة الوصول إلى البيانات المشتركة باستخدام وسائل مثل:
- كائنات المزامنة هي كائنات مصممة لتقييد الوصول إلى مورد مشترك إلى مؤشر ترابط واحد فقط في وقت معين. عن طريق قفل وفتح المزامنة ، المواضيع مزامنة أفعالهم. يمكن أن تكون المزامنة في حالتين: مقفلة وغير مقفلة.
- الإشارات هي كائنات مصممة للتحكم في الوصول إلى مورد مشترك بواسطة عدة سلاسل رسائل في نفس الوقت ، عدد معين من سلاسل الرسائل. يتم استخدام الإشارة للتحكم في عدد الأذونات للوصول إلى مورد.
- المتغيرات الشرطية هي كائنات تسمح للخيوط بانتظار استيفاء شرط معين قبل مواصلة عملها. تسمح لك المتغيرات الشرطية بتنفيذ سيناريوهات مزامنة وتفاعل أكثر تعقيدا بين سلاسل الرسائل.
- الحواجز هي كائنات تسمح لعدد معين من مؤشرات الترابط بالمزامنة في مرحلة معينة من تنفيذ البرنامج. تمنع الحواجز التدفقات حتى يتم استيفاء شروط معينة لمواصلة العمل.
يتيح لك الاستخدام السليم لهذه الأدوات وغيرها من أدوات المزامنة إنشاء برامج آمنة وفعالة مع معالجة متعددة مؤشرات الترابط. ومع ذلك ، يمكن أن يؤدي الاستخدام غير السليم لأدوات المزامنة إلى مشاكل مثل حالة السباق والجمود والجمود.
عند تطوير البرامج باستخدام تعدد مؤشرات الترابط ، خاصة في ج ، من الضروري مراعاة تفاصيل العمل مع مؤشرات الترابط وتطبيق أدوات المزامنة بشكل صحيح لتجنب المشاكل وضمان التشغيل الصحيح والفعال.
أمثلة على استخدام التدفقات في ج
في ج ، تسمح التدفقات بإدخال البيانات وإخراجها. فيما يلي بعض الأمثلة على استخدام التدفقات في ج:
القراءة من ملف
نموذج التعليمات البرمجية:
# تشملكثافة العمليات الرئيسية () {}.
الكتابة إلى ملف
نموذج التعليمات البرمجية:
# تشملكثافة العمليات الرئيسية () {}.
سؤال وجواب
ما هو تيار?
تيار في ج هو تجريد يمثل سلسلة من البيانات التي يمكن قراءتها أو كتابتها. تتيح لك التدفقات العمل مع مصادر وأهداف بيانات مختلفة ، مثل الملفات أو الإدخال/الإخراج القياسي.
كيف يمكنني إنشاء تيار في ج?
لإنشاء تيار في ج ، تحتاج إلى استخدام وظيفة 'فوبين' ، الذي يفتح الملف وإرجاع مؤشر إلى تيار. على سبيل المثال ، "ملف* ملف = فوبين ("ملف.النص" ، "ص") ؛ "يفتح الملف" ملف.النص "للقراءة وإرجاع مؤشر إلى دفق "ملف".
ما هي العمليات التي يمكن القيام بها على تيار في ج?
باستخدام تيارات في ج ، يمكنك تنفيذ عمليات مختلفة ، مثل قراءة وكتابة البيانات إلى الملفات ، والانتقال من خلال ملف ، المدخلات والمخرجات المنسقة ، ومعالجة الأخطاء ، وغيرها من العمليات. يمكن تنفيذ هذه العمليات باستخدام وظائف مثل` فريد ` ، ` فوريت ` ، ` فسيك ` ، ` فبرينتف ` ، ` فسكانف ' وغيرها.