سؤال

تماما كما في العنوان.من المشكوك فيه أنه كذلك، لكن لم أتمكن من العثور عليه في أي مكان مذكور صراحةً.وبالنسبة لهذه الخاصية لا أود الاعتماد على المضاربات.

هل كانت مفيدة؟

المحلول

إذا كنت تستخدم متعددة الخيوط إصدار CRT، جميع الوظائف آمنة لمؤشر الترابط، لأنه يتم تخزين أي معلومات خاصة بمؤشر الترابط فيه TLS.في الواقع، لا يستخدم rand_s معلومات الحالة في المقام الأول، نظرًا لأنه يستدعي واجهة برمجة تطبيقات نظام التشغيل فقط، لذلك لا يُطرح سؤال حول سلامة سلسلة المحادثات بالنسبة لـ rand_s.rand()، ولكنها تعتمد على قيمة أولية لإنشاء رقم عشوائي.

نصائح أخرى

قال كريس: rand() ليست آمنة لمؤشر الترابط لأن حالتها الداخلية ثابتة، ولكن rand_s() يجب أن تكون آمنة للخيط، ومع ذلك.

وأضاف جيف أنه مع الإصدار متعدد مؤشرات الترابط من MSVCRT، rand()يتم الاحتفاظ بحالة s في وحدة تخزين مؤشر الترابط المحلية، لذلك لا يزال الأمر على ما يرام.

يأتي Visual Studio مع المصدر لمكتبة وقت التشغيل.على الرغم من أن الخوض في بعض هذه الأمور قد يكون مؤلمًا إلى حد ما، إلا أن الدالة rand_s()‎ بسيطة جدًا.

كل ما يفعله rand_s() هو استدعاء SystemFunction036() في ADVAPI32.DLL للحصول على القيمة العشوائية.يجب أن يكون أي شيء في ADVAPI32.DLL آمنًا لمؤشر الترابط.

من جانبه، يحصل rand_s() على المؤشر إلى تلك الوظيفة بطريقة آمنة للخيط.

لا أعرف ما إذا كان rand_s آمنًا لسلسلة الرسائل، ولكن يبدو أنه من المحتمل أن يكون كذلك، حيث يبدو أنه يقوم برحلة ذهابًا وإيابًا إلى نظام التشغيل بحثًا عن الإنتروبيا.(طالما قمت بالارتباط بـ VC++ CRT متعدد الخيوط، فإن جميع الرهانات متوقفة إذا قمت بالارتباط بخيط واحد)

إذا كان مدعومًا بواسطة Windows CRT، فيمكنك تجربة الاتصال بـ rand_r وهو إصدار posix reentrant من rand.أو من الأفضل Boost::random، إذا كنت تستخدم Boost بالفعل.

بالنظر إلى مدى انتشار مؤشرات الترابط المتعددة قريبًا، لا ينبغي لأحد أن يستخدم rand() بعد الآن في التعليمات البرمجية الجديدة - حاول دائمًا استخدام rand_r/rand_s/boost/various rands الآمنة المعتمدة على النظام الأساسي/إلخ.

لا أستطيع التفكير في أي سبب لعدم كون rand_s() أو حتى rand() آمنًا لمؤشر الترابط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top