Исправленный код:
import threading
COUNTER = 100000
lock = threading.Lock()
def add():
global x
with lock:
for i in range(COUNTER):
x += 1
def subtract():
global x
with lock:
for i in range(COUNTER):
x -= 1
x = 0
t0 = threading.Thread(target=add)
t1 = threading.Thread(target=subtract)
t0.start()
t1.start()
# Added the below lines
t0.join()
t1.join()
# END
print(x)
Причина вашей ошибки в том, что ваш основной поток не ждет, пока ваши дочерние потоки завершат sh там процессы. Вот почему вы получаете необычный результат, когда печатаете значение x между ними.