هل يمكن أن تؤثر multithreading على لعبة كونواي من استنساخ الحياة؟

StackOverflow https://stackoverflow.com/questions/3301562

  •  26-09-2020
  •  | 
  •  

سؤال

لقد قمت بتنفيذ هذه فكرة اللعبة الصغيرة، والتي هي (بطريقة أو بأخرى؟) مماثلة لمباراة كونواي الحياة:

0) لديك مصفوفة من النقاط الملونة (قيم RGB) 1) إذا كانت الخلية المجاورة قيمة X أقل من Y، ضع y= 0 على تلك الخلية (أين x و y حمراء || أخضر || أزرق) 2) الأحمر يدق الأخضر يدق الأزرق يدق الأحمر

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

يمكن أن تمنع multithreading هذا (يقول، إطلاق مؤلمين، واحد يبدأ في الخلية الأولى والآخر في آخر واحد)؟يرجى العفو عن جهلي على التزامن، لكنني شعرت أن هذه طريقة لطيفة للبدء في العمل معها.

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

المحلول

تخميني هو أنك تقوم بتحديث Matrix Inplace، في حين يجب عليك نسخ الحافظ على مسار الحالة القديمة للمصفوفة، وتحديث واحدة جديدة، ثم استبدال واحد الأصلي عن طريق التحديث. بهذه الطريقة، لن تقوم بتحديث بعض الخلايا، ثم في السطر التالي لاختبار قيمها. وبالتالي، ستكون مشكلة خوارزمية، غير مرتبطة بالبرنامج (وبالتالي لا يمكن أن تساعد مؤشرات التصدير).

نصائح أخرى

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

سوف تكون أفضل حالا في تكييف خوارزميةك لمنع هذا.

الاعتماد على متعددة المبالغ لتغيير السلوك ليس شيئا جيدا.هذا هو، في جوهرها، في محاولة لإدخال حالة سباق في التعليمات البرمجية الخاصة بك.عادة، عند إضافة خلائط متعددة إلى خوارزمية، أولوية أولوية <قوية> منع أي تغييرات في السلوك.

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

يعتمد

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

ومع ذلك، إذا قررت القيام بذلك، ضع في اعتبارك أن كل شيء يجب أن يحسب ما يحتاجه إلى ما يحتاج إليه من أجل "؛ بدوره التالي "ووضعه في مصفوفة جديدة، عندما تبديل في المصفوفة (لا يمكن نسخها، ما عليك سوى تغيير المؤشر في مكان ما) في نهاية المنعطف، بحيث لا يغير مؤشر ترابط واحد القيم التي يحتاجها الآخرون للقيام بحساباتهم. وبالتالي لا يمكن السماح للخيط "بالتحول إلى الأمام" من كل منها " آخر. قد يعني هذا أنه يتضح أنه غير فعال للقيام به مع مواضيع متعددة - قد يختلف الأميال الخاص بك.

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