Member 11589429 Ответов: 1

Многопоточность в C#


Я использую следующий пример .

using System;
using System.Threading;

public class MyThread {

        public void Thread1() {
                for (int i = 0; i < 10; i++) {
                        Console.WriteLine("Hello world " + i);
                        Thread.Sleep(1);
                }
        }
}

public class MyClass {

        public static void Main() {
                Console.WriteLine("Before start thread");

                MyThread thr1 = new MyThread();
                MyThread thr2 = new MyThread();

                Thread tid1 = new Thread(new ThreadStart(thr1.Thread1) );
                Thread tid2 = new Thread(new ThreadStart(thr2.Thread1) );

                tid1.Start();
                tid2.Start();
        }
}


Это работает так.

выход :
Before start thread
Hello world 0
Hello world 0
Hello world 1
Hello world 1
Hello world 2
Hello world 2
Hello world 3
Hello world 3
Hello world 4
Hello world 4
Hello world 5
Hello world 5
Hello world 6
Hello world 6
Hello world 7
Hello world 7
Hello world 8
Hello world 8
Hello world 9
Hello world 9


Он печатает i из первого цикла for и спит в течение 1 секунды, переходя ко второму циклу for.Он печатает i со второго для цикла сна в течение 1 секунды и переходит к первому.Я не хочу, чтобы он переключался на контекст после каждой печати.Я хочу,чтобы через определенное время после печати некоторого значения i, спать в течение некоторого времени в течение этого периода печати значения i из второго цикла.После этого истекает снова переход к первому циклу.например: предполагается,что он печатает от 1 до 2-10 от первого цикла for и спит переход ко второму, он может печатать от 1 до 2-10 от второго цикла for.и перейти к первому циклу.Значение i Из первого цикла может быть не одинаковым для второго.

Что я уже пробовал:

using System;
using System.Threading;

public class MyThread {

        public void Thread1() {
                for (int i = 0; i < 10; i++) {
                        Console.WriteLine("Hello world " + i);
                        Thread.Sleep(1);
                }
        }
}

public class MyClass {

        public static void Main() {
                Console.WriteLine("Before start thread");

                MyThread thr1 = new MyThread();
                MyThread thr2 = new MyThread();

                Thread tid1 = new Thread(new ThreadStart(thr1.Thread1) );
                Thread tid2 = new Thread(new ThreadStart(thr2.Thread1) );

                tid1.Start();
                tid2.Start();
        }
}

Richard MacCutchan

Измените вызовы в спящий режим, чтобы использовать случайные значения.

1 Ответов

Рейтинг:
1

OriginalGriff

Во - первых, сон(1) - это не "сон на одну секунду", а "сон на одну миллисекунду" - тысячную долю секунды.

Во-вторых, два потока выполняют один и тот же код, но они не разделяют переменные:

for (int i = 0; i < 10; i++)
создает новый экземпляр i в каждом потоке они будут иметь разные значения и не будут влиять друг на друга.
Вы не можете гарантировать, какой поток будет работать в любое конкретное время - это полностью зависит от операционной системы, которая будет выбирать потоки, которые не ждут чего - то (например, таймер сна) эффективно случайным образом, как только ядро станет доступным, - что означает, что они могут фактически разрушиться в то же время, если у вас есть достаточное количество ядер и система не слишком занята: если вы хотите контролировать то, что происходит, когда в многопоточной системе, вы несете ответственность за явное выполнение этого, чаще всего с помощью семафоров.

Если вы хотите, чтобы поток два ждал поток один, вам нужно заставить его ждать, пока поток один не будет готов к нему - а это означает, что они не могут использовать один и тот же код, или поток 1 будет в конечном итоге ждать, пока он закончит!

И чтобы было еще хуже ... основной метод не выполняется ни в одном из этих потоков, поэтому, когда он дойдет до конца, ваше приложение закроется, и вы ничего не увидите...

Я предлагаю вам вернуться к вашим записям курса и прочитать их снова - это сложный предмет, и Вы, кажется, еще не поняли его должным образом.