افهم أسلوب Rust في التزامن الذي يعتمد على مفهوم "التزامن الشجاع".
التزامن هو قدرة البرنامج على تنفيذ مهام متعددة في وقت واحد على نفس وحدة المعالجة المركزية. يتم تشغيل المهام المتزامنة وإكمالها في وقت متداخل دون ترتيب محدد ، على عكس التوازي ، حيث يتم تشغيل العديد من المهام أو المهام الفرعية لنفس المهمة في نفس الوقت على أجهزة متعددة معالجات.
يتميز Rust بميزات أدائه ودعمه للتزامن بطريقة آمنة وفعالة. يعتمد نهج روست في التزامن على مفهوم "التزامن الشجاع" حيث تهدف اللغة إلى تسهيل الكتابة بأمان رمز متزامن من خلال نظام الملكية والاقتراض الذي يفرض قواعد صارمة في وقت التجميع لمنع تتبع البيانات ويضمن الذاكرة أمان.
فهم التزامن في الصدأ
يوفر Rust العديد من أساسيات التزامن لكتابة البرامج المتزامنة ، بما في ذلك سلاسل الرسائل ، وتمرير الرسائل ، وكائنات المزامنة ، والأنواع الذرية ، وغير المتزامن / في انتظار البرمجة غير المتزامنة.
في ما يلي نظرة عامة على أساسيات التزامن في Rust:
- الخيوط: الصدأ يوفر a الأمراض المنقولة جنسيا:: موضوع وحدة في مكتبتها القياسية لإنشاء وإدارة المواضيع. يمكنك إنتاج مواضيع جديدة باستخدام ملف خيط:: تفرخ وظيفة. ال خيط:: تفرخ يأخذ الإغلاق الذي يحتوي على رمز للتنفيذ. يمكنك أيضًا تشغيل سلاسل الرسائل التي يمكن تشغيلها بالتوازي ، ويوفر Rust أساسيات التزامن لتنسيق تنفيذها. مدقق الاقتراض يضمن أن المراجع لا تؤدي إلى سلوكيات غير متوقعة.
- تمرير الرسالة: يدعم نموذج التزامن الخاص بـ Rust تمرير الرسائل بين سلاسل المحادثات. ستستخدم القنوات التي تم تنفيذها من خلال الأمراض المنقولة جنسيا:: sync:: mpsc وحدة لتمرير الرسالة. تتكون القناة من جهاز إرسال (مرسل) وجهاز استقبال (المتلقي). يمكن للخيوط إرسال الرسائل من خلال جهاز الإرسال واستلامها من خلال جهاز الاستقبال. يوفر هذا طريقة آمنة ومتزامنة للتواصل بين الخيوط.
- كائنات المزامنة والأنواع الذرية: يوفر Rust العناصر الأساسية للمزامنة ، بما في ذلك كائنات المزامنة (الأمراض المنقولة جنسيا:: sync:: Mutex) وأنواع ذرية (الأمراض المنقولة جنسيا:: مزامنة:: ذري) ، لضمان الوصول الحصري لمشاركة البيانات. تسمح كائنات المزامنة لخيوط متعددة بالوصول إلى البيانات بشكل متزامن مع منع سباقات البيانات. توفر الأنواع الذرية عمليات ذرية على البيانات المشتركة ، مثل زيادة العداد ، دون الحاجة إلى قفل صريح.
- عدم التزامن / انتظار والعقود الآجلة: الصدأ غير متزامن/انتظر يوفر بناء الجملة وظائف لكتابة التعليمات البرمجية غير المتزامنة التي يمكنك تنفيذها بشكل متزامن. تتعامل البرامج غير المتزامنة بكفاءة مع المهام المرتبطة بالإدخال / الإخراج مما يتيح للبرامج أداء مهام أخرى أثناء انتظار عمليات الإدخال / الإخراج الأخرى. الصدأ غير متزامن/انتظر يعتمد بناء الجملة على العقود الآجلة ، ويمكنك تشغيلها باستخدام غير متزامن الأمراض المنقولة جنسيا أو طوكيو مكتبات وقت التشغيل.
خيوط الصدأ خفيفة الوزن ، وغياب وقت التشغيل الزائد يجعلها مناسبة تمامًا للتطبيقات عالية الأداء. تتكامل أساسيات التزامن في Rust بسلاسة مع العديد من المكتبات والأطر لتلبية احتياجات التزامن المختلفة.
كيفية استخدام خيوط تفرخ في الصدأ
ستستخدم ملف الأمراض المنقولة جنسيا:: موضوع وحدة لتفرخ المواضيع. ال الأمراض المنقولة جنسيا:: موضوع:: تفرخ تتيح لك الوظيفة إنشاء سلسلة رسائل جديدة تعمل بشكل متزامن مع الخيط الرئيسي أو أي مؤشرات ترابط أخرى موجودة في برنامجك.
إليك كيفية إنشاء سلسلة رسائل باستخدام الأمراض المنقولة جنسيا:: موضوع:: تفرخ وظيفة:
يستخدم الأمراض المنقولة جنسيا:: موضوع.
الجبهة الوطنيةرئيسي() {
// ولّد موضوعًا جديدًا
يترك thread_handle = خيط:: تفرخ (|| {
// الكود المنفذ في الخيط الجديد يذهب هنا
println!("مرحبًا من الموضوع الجديد!");
});// انتظر حتى ينتهي الموضوع الذي تم إنتاجه
thread_handle.join (). unrap () ؛
// الكود المنفذ في الموضوع الرئيسي يستمر هنا
println!("مرحبا من الموضوع الرئيسي!");
}
ال رئيسي تقوم الوظيفة بإنشاء سلسلة رسائل جديدة بامتداد خيط:: تفرخ الوظيفة عن طريق تمرير إغلاق يحتوي على رمز التنفيذ في الخيط (في هذه الحالة ، يكون الإغلاق وظيفة مجهولة). يقوم الإغلاق بطباعة رسالة تشير إلى أن الموضوع الجديد قيد التشغيل.
ال ينضم طريقة على مقبض_الخيط يسمح للخيط الرئيسي بالانتظار حتى يكتمل التنفيذ الذي تم إنتاجه. بالاتصال ينضم، تضمن الوظيفة أن الخيط الرئيسي ينتظر حتى يكتمل الخيط الذي تم إنتاجه قبل المتابعة.
يمكنك إنتاج خيوط متعددة واستخدام حلقة أو أي حلقة أخرى هيكل التحكم في الصدأ لإنشاء العديد من عمليات الإغلاق وتفرخ سلاسل الرسائل لكل منها.
يستخدم الأمراض المنقولة جنسيا:: موضوع.
الجبهة الوطنيةرئيسي() {
يترك عدد_الخيوط = 5;يتركموت مقابض الخيط = vec![];
ل أنا في0..num_threads {
يترك thread_handle = خيط:: تفرخ (يتحرك || {
println!("مرحبًا من الموضوع {}"، أنا)؛
});
thread_handles.push (thread_handle) ؛
}ل مقبض في مقابض الخيط {
handle.join (). unsrap () ؛
}
println!("كل المواضيع انتهت!");
}
تولد حلقة for خمسة خيوط ، كل منها مخصص لمعرف فريد أنا مع متغير الحلقة. عمليات الإغلاق تلتقط قيمة أنا مع ال يتحرك الكلمات الرئيسية لتجنب قضايا الملكية، و ال مقابض الخيط المتجه يخزن الخيوط في وقت لاحق في ينضم حلقة.
بعد تفريخ جميع الخيوط ، يتم وضع ملف رئيسي تتكرر الدالة على امتداد مقابض الخيط ناقلات المكالمات ينضم على كل مقبض ، وينتظر تنفيذ كافة مؤشرات الترابط.
تمرير الرسائل عبر القنوات
يمكنك تمرير الرسائل من خلال المواضيع مع القنوات. يوفر Rust وظائف لتمرير الرسائل في ملف الأمراض المنقولة جنسيا:: sync:: mpsc وحدة. هنا، mpsc لتقف على "منتج متعدد ، مستهلك واحد" ويسمح بالاتصال بين سلاسل محادثات متعددة عن طريق إرسال واستقبال الرسائل عبر القنوات.
إليك كيفية تنفيذ الرسائل التي تمر عبر قنوات الاتصال بين سلاسل الرسائل في برامجك:
يستخدم الأمراض المنقولة جنسيا:: مزامنة:: mpsc ؛
يستخدم الأمراض المنقولة جنسيا:: موضوع.الجبهة الوطنيةرئيسي() {
// إنشاء قناة
يترك (المرسل ، المستقبل) = mpsc:: channel () ؛// تفرخ موضوع
خيط:: تفرخ (يتحرك || {
// أرسل رسالة عبر القناة
المرسل ("مرحبا من الموضوع!").بسط()؛
});
// تلقي الرسالة في الموضوع الرئيسي
يترك Receiver_message = receiver.recv (). unsrap () ،
println!("الرسالة المستلمة: {}"، تم استلام الرسالة) ؛
}
ال رئيسي وظيفة تنشئ قناة مع mpsc:: قناة () الذي يعيد أ مرسل و أ المتلقي. ال مرسل يرسل رسائل إلى المتلقي الذي يتلقى الرسائل. ال رئيسي تستمر الوظيفة في نشر مؤشرات الترابط ونقل ملكية ملف مرسل لإغلاق الخيط. داخل إغلاق الخيط ، يكون ملف المرسل () وظيفة ترسل رسالة عبر القناة.
ال Receiver.recv () وظيفة يتلقى الرسالة عن طريق وقف التنفيذ حتى يتلقى الموضوع الرسالة. ال رئيسي وظيفة طباعة الرسالة إلى وحدة التحكم بعد نجاح استلام الرسالة.
لاحظ أن إرسال رسالة عبر القناة يستهلك المرسل. إذا كنت بحاجة إلى إرسال رسائل من سلاسل رسائل متعددة ، فيمكنك استنساخ المرسل باستخدام ملف المرسل () وظيفة.
بالإضافة إلى ذلك ، فإن mpsc توفر الوحدة طرقًا أخرى مثل try_recv ()، الذي يحاول تلقي رسالة بدون حظر ، و iter ()، مما يؤدي إلى إنشاء مكرر على الرسائل المستلمة.
توفر الرسائل التي تمر عبر القنوات طريقة آمنة ومريحة للتواصل بين الخيوط مع تجنب سباقات البيانات وضمان التزامن الصحيح.
يضمن نموذج ملكية Rust والاقتراض سلامة الذاكرة
يجمع Rust بين الملكية والاقتراض ومدقق الاقتراض لتوفير إطار برمجة قوي وآمن ومتزامن.
يعمل مدقق الاستعارة كشبكة أمان ، ويكتشف المشكلات المحتملة في وقت التجميع بدلاً من الاعتماد على فحوصات وقت التشغيل أو جمع البيانات المهملة.