ולקח לי קצת זמן לפתור את זה.
הסיבה שאת לא מקבלת תמיד את אותו המספר- כי ה טרדים עובדים באותו הזמן, ולכן חלק מהפעולות מתבזבזות.
הפתרון - לשים נעילת טרדים על החלק הקריטי (counter++)
כך שבוודאות חלק קוד זה ירוץ תמיד בזמן משלו.
אז אלו התוספות שלי בקוד.
נ.ב.
הוספתי את
Thread.Sleep(TimeSpan.Zero);
כדי לשחרר את הטריד הנוכחי, אחרת - מה שיתקבל זה ש טריד 1 רץ כל הזמן ורק אחרי שהוא מסיים הטריד השני מתחיל.
ואת זה אנחנו לא רוצים.
(הוספתי משתנה ID לטרדים, כדי שאוכל להדפיס למסך הודעות ולדעת מאיזה טריד הדפסתי אותם.)
class Program
{
static int counter { get; set; }
static object locker = new object();
public static void threadProc(int id)
{
for (int i = 0; i < 10000; i++)
{
lock(locker)
{
counter++;
}
Thread.Sleep(TimeSpan.Zero);
}
}
static void Main(string[] args)
{
var te1 = Task.Run(() => threadProc(1));
var te2 = Task.Run(() => threadProc(2));
Task.WhenAll (new[] { te1, te2 }).Wait();
Console.WriteLine(counter);
Console.ReadKey();
}
}
קודם תעני על זה בעברית.
אחר כך תנסי ליישם את זה C#
נו נו, עוד שורה לפני שמכניסים ללולאה , פחות שורה, זה לא יהפוך את הקוד למתוחכם, הקוד הזה די פשוט בכל מקרה
חוץ מזה- נראה לי שבכל מקרה הלוח יוצא אותו דבר (אם יהפכו אותו ויסובבו אותו)
עדיין, הוספה של פרמטר רנדום כדי להחליט באיזה שורה המלכה הראשונה תמוקם לא משנה הרבה
מתחכם אחד
גם רושמים אלגוריתם שממקם את המלכות כל פעם באותו מקום
(כי המלכה הראשונה מוצבת תמיד ב[0][0]) ואפשר להשיג את אותה תוצאה בהדפסה של מחרוזת ,זה לא חכמה, כל הרעיון הוא החשיבה האלגוריתמית