#!/usr/bin/env python
#-*-*- encoding: utf-8 -*-*-
import threading
import time

ASEGURAR = True
#ASEGURAR = False

class Recurso:
	def __init__(self):
		self.dato1 = 0
		self.dato2 = 0
		if ASEGURAR:
			self.lock = threading.Lock()
	def incrementar(self):
		if ASEGURAR:
			self.lock.acquire()
		try:
			self.dato1 += 1
			time.sleep(0.5)
			self.dato2 += 1
		finally:
			if ASEGURAR:
				self.lock.release()

	def comprobar(self):
		if ASEGURAR:
			self.lock.acquire()
		try:
			if self.dato1 != self.dato2:
				print "¡¡¡SON DIFERENTES!!!"
		finally:
			if ASEGURAR:
				self.lock.release()
	
#Sin los if ASEGURAR tiene esta pinta:
#
#	def comprobar(self):
#		self.lock.acquire()
#		try:
#			if self.dato1 != self.dato2:
#				print "¡¡¡SON DIFERENTES!!!"
#		finally:
#			self.lock.release()
#
#Desde Python 2.5, podemos utilizar with (haciendo primero from __future__ import with_statement, o desde Python 2.6 por defecto),
#que sería similar al lock de C# o synchronized de Java
#	def comprobar(self):
#		with self.lock:
#			if self.dato1 != self.dato2:
#				print "¡¡¡SON DIFERENTES!!!"

incrementar = True

class Incrementador(threading.Thread):
	def __init__(self,recurso):
		threading.Thread.__init__(self)
		self.recurso = recurso
	def run(self):
		while incrementar:
			self.recurso.incrementar()

r = Recurso()

m = Incrementador(r)
m.start()

print "Comienzo a comprobar"
for i in range(100000):
	r.comprobar()
print "Termino de comprobar"

incrementar = False

