Больше совета, чем не ответ:
(Пожалуйста, обратите внимание, что я не вижу никакой пользы в реальной жизни за то, что вы пытаетесь достичь, поэтому я отношусь к вашим проблемам в качестве мысленного эксперимента/доказательство концепции не объяснено подробно.)
Если вы хотите, чтобы ваши темы на «раса» для контроля, не г ive ваша основная нить на голову!Создание потока имеет некоторые накладные расходы, и основной поток уже создан (поскольку он создает другой поток). Если вы ищете в основном равные шансы как для основного, так и для рабочего потока, вам следует подождать, пока ваш рабочий поток будет создан в основном потоке и дождитесь, когда основной поток начнет гонку в фоновом потоке. Это может быть достигнуто synch objects.
На практике это будет выглядеть следующим образом:
Вы должны объявить два ManualResetEvent S, которые видны как для вашего Main- и фоновый поток, как это:
private static ManualResetEvent backgroundThreadReady = new ManualResetEvent(false);
private static ManualResetEvent startThreadRace = new ManualResetEvent(false);
Затем в основном потоке вы должны дождаться инициализации своей нити, например:
static void Main(string[] args)
{
Thread t = new Thread(WriteX);
t.Start();
backgroundThreadReady.WaitOne(); // wait for background thread to be ready
startThreadRace.Set(); // signal your background thread to start the race
for (int i = 0; i < 1000; i++)
{
Console.Write("O");
}
}
И в вашей теме:
private static void WriteX()
{
backgroundThreadReady.Set(); // inform your main thread that this thread is ready for the race
startThreadRace.WaitOne(); // wait 'till the main thread starts the race
for (int i = 0; i < 1000; i++)
{
Console.Write(".");
}
}
Обратите внимание, что я мог бы использовать другие объекты waitable синхронизации (семафор, автовозврата событие, даже критический замок раздел с некоторыми хака, я только выберите самое простое, быстрое решение, которое можно легко расширить).
(не) удача. Нет никакой гарантии, что O будет первым, но накладные расходы при создании вторичного потока сделают очень маловероятным, что второй поток в конечном итоге достигнет финишной черты. Вы можете сравнить это с стоячей 20 см от финиша, а затем кричать «Господа, запустите свои двигатели и идите!» и затем немедленно сделайте шаг над финишной чертой. Шанс присутствует, но незначительный. –
Поведение не является детерминированным и зависит от планировщика потоков ОС. Не забывайте, что создание самого потока имеет накладные расходы. Попробуйте запустить его достаточно времени, и вы увидите его в разных вариантах. –
Это может относиться к времени, которое требуется для запуска потока (в то время mainthread продолжает свою собственную работу ... иначе он запускает цикл for). Пробовали ли вы, что происходит, когда вы ставите короткий сон после t.Start() в основном (например, около 30 миллисекунд)? – Thomas