Недавно начал изучать программирование, и не могу понять одной вещи, которая не дает мне покоя. Есть какое то фундаментальное различие в вычислениях, которые происходят в железе и программировании. Например:
___/ __>>lamp
Если контакт замкнется лампочка загориться. Мы можем это выразить вот так:
if contact lamp=true
Но, это не то же самое! Если посторонняя программа изменит значение переменной contact, лампочка по прежнему будет «гореть». Конечно, можно ввести блокировки и добиться нужного поведения, но ведь в электросхеме это происходит без дополнительных костылей. Там подобная проблема просто не может возникнуть.
Я вот думаю, ведь компьютер управляется электрическими сигналами, это ведь та же электросхема, только сложная. Тогда откуда берется такой гигантский разрыв в логиках того и другого?
Неверное сравнение. Правильным здесь будет такое: два выключателя связаны палкой - когда толкаем один выключатель, то включается другой, но потом палка ломается.
А как реализовать программно эту схему? Единственное, что я вижу — это запустить независимый цикл, который будет на каждой итерации «синхронизировать». Но ведь постоянно работающий цикл — это расточительно наверное?
Всё это выражается, дело в том, что то, что сейчас понимается под программированием - это не программирование в целом, а примитивное представление.
Железо - это состояния и цепочная зависимость эти состояний. Т.е. ты можешь на смену состояния повесить смену другого состояния в цепочку.
Далее - в твоей схеме лампочка - это зависимое от выключения состояние, а переменная же твоя - тригер. Он не зависим - его состояние нужно переключить.
Почему такое поведение не реализуется - это сложно для обычного фоннеймовского мышления. Да и оно менее универсально и более сложно. Ди и его реализация не имеет смысла на том железе, что юзают пацаны.
Поэтому у каждого потока своё состояние, а твои флаги - это общие флаги и смена их не меняет эти состояния. Эмулировать ты это можешь апдейтом состояния каждого потока.
Влиять как-то на другие потоки ты не можешь - это уже не программирование в текущем понимании. Т.е. это надо взять, сменить состояние у общего флага и во всех потоках вызвать апдейт состояния.
Разница лишь в том, что потенциал есть везде одновременно, в т.ч. нулевой, а контекст исполнения только один. Если при любом изменении перенаправлять контекст в место его обработки, получим полную аналогию (в рамках импульсной электроники, естественно). Это и есть РП, или по-дворовому биндинги.