Как определить из потока2, если поток1 обновил значение в классе

Семантика

У меня есть поток thread1, который обновляет массив в классе. Каждый раз, когда одно значение обновляется в массиве с помощью thread1, thread2должен быть уведомлен. Другими словами, thread2 имеет значение следить, и если оно было изменено, сделайте что-нибудь. Если нет, то дождитесь изменения значения.

Пытаться

Для thread1 я создал Task и заполнил Array. Однако я застрял на том, как thread2следит за находится в стеке и когда доступен элемент. Когда элементом является добавлен, класс, содержащий массив, уведомляет другой поток о доступности элемента.

AutoResetEvent pro = new AutoResetEvent(true);
AutoResetEvent con = new AutoResetEvent(false);

t1 = new Thread(insert);
t2 = new Thread(OnValueAvailable);
t1.Start();
t2.Start();

public void OnValueAvailable()
{
    pro.WaitOne();
    class.doSum();
    con.Set();
}

public void insert()
{ 
    for(int i=0;i<10;i+=){
        con.WaitOne();
        class.push(randomNumber);
        pro.Set();
    } 
}    

Также я не понимаю, как постоянно вызывается t2.

Вы можете использовать объект AutoResetEvent или ManualResetEvent, чтобы сигнализировать другому потоку. Поток, который хочет получать уведомления, должен регулярно проверять этот объект, чтобы видеть, стал ли он установлен (сигнализирован). AutoResetEvent - самый простой способ избежать потери сигнала из-за состояния гонки.

Lasse V. Karlsen 10.09.2018 11:00

как установить это для двух потоков, я создал два autoresetevents, так как a1.waitone () останавливает thread1 и a2.waitone () останавливает thread2, если a2.waitone () или a1.waitone, вызванные в thread1, оба могут остановить thread1

Ajay 10.09.2018 12:13

Имейте в виду, что Task не является Thread. Task будет использовать (возможно) несколько Thread. так что будьте осторожны со своим языком здесь.

Liam 10.09.2018 12:23

Вы должны запустить Task, используя Task.Run(() => {});, а не new Task

Liam 10.09.2018 12:25

спасибо попробую ваши предложения, а затем измените вопрос еще раз, если необходимо

Ajay 10.09.2018 12:26

Если вы хотите использовать стек и задачу, используйте встроенный класс ConcurrentStack<T>.

Liam 10.09.2018 12:27

Остальная часть этого вопроса, которую я предлагаю, слишком широка. Попробуйте мои предложения выше и посмотрите, как у вас дела.

Liam 10.09.2018 12:29

Остерегайтесь Проблема ABA каждый раз, когда вы хотите, чтобы поток постоянно опрашивал некоторую переменную и делал что-то каждый раз, когда переменная изменяется. Если вам действительно нужно, чтобы поток отвечал на каждое изменение, вы можете рассмотреть возможность использования очереди, в которой для каждого «изменения» в очередь помещается другой объект / значение / токен.

besmirched 10.09.2018 16:30
1
8
70
0

Другие вопросы по теме