Hi, In a multithreaded program, how do I ensure that a block of code in a thread is always executed fully before passing control to another thread. Does "Lock" serve this purpose?
The foll program is a dummy one, with 2 threads. One put a number onto a queue (of max size 1) and the other thread reads from the que. However, on running this program (Win XP, NOT via IDLE - it hangs when I run it thru IDLE) the output that I see on screen indicates that the block of code within the lock aquire and release was not run completely before the other thread started running. Note that the print messages from the 2 threads seem to be interspersed together: import threading import Queue class put_num(threading.Thread): stop_thread = 0 def __init__(self, num, que): threading.Thread.__init__(self) self.que = que self.num = num self.lock = threading.Lock() def run(self): global stop_thread for k in range (20): self.lock.acquire() print "put_num: ", self.num self.que.put(str(self.num)) print "put_num: Que size = ", self.que.qsize() self.num = self.num + 1 self.lock.release() class get_num(threading.Thread): stop_thread = 0 def __init__(self, que): threading.Thread.__init__(self) self.que = que self.lock = threading.Lock() def run(self): global stop_thread for k in range (20): self.lock.acquire() mynum = self.que.get() print "get_num: ", mynum print "get_num: Que size = ", self.que.qsize() self.lock.release() my_que = Queue.Queue(1) put_num_thread = put_num(742, my_que) get_num_thread = get_num(my_que) print "Starting threads" put_num_thread.start() get_num_thread.start() print "Waiting for threads to finish" put_num_thread.join() get_num_thread.join() print "Closing down" raw_input("\n\nPress enter to Quit: ") This is the out put of the above program: Starting threads put_num: 742 Waiting for threads to finish put_num: Que size = 1 get_num: 742 get_num: Que size = 0 put_num: 743 put_num: Que size = 1 get_num: 743 get_num: Que size = 0 put_num: 744 put_num: Que size = 1 get_num: 744 get_num: Que size = 0 put_num: 745 put_num: Que size = 1 get_num: 745 get_num: Que size = 0 put_num: 746 put_num: Que size = 1 get_num: 746 get_num: Que size = 0 put_num: 747 put_num: Que size = get_num: 747 get_num: Que size = 0 0 put_num: 748 put_num: Que size = 1 get_num: 748 get_num: Que size = 0 put_num: 749 put_num: Que size = get_num: 749 get_num: Que size = 0 0 put_num: 750 put_num: Que size = 1 get_num: 750 get_num: Que size = 0 put_num: 751 put_num: Que size = 1 get_num: 751 get_num: Que size = 0 put_num: 752 put_num: Que size = get_num: 752 get_num: Que size = 0 0 put_num: 753 put_num: Que size = 1 get_num: 753 get_num: Que size = 0 put_num: 754 put_num: Que size = 1 get_num: 754 get_num: Que size = 0 put_num: 755 put_num: Que size = get_num: 755 get_num: Que size = 0 0 put_num: 756 put_num: Que size = get_num: 756 get_num: Que size = 0 0 put_num: 757 put_num: Que size = get_num: 757 get_num: Que size = 0 0 put_num: 758 put_num: Que size = 1 get_num: 758 get_num: Que size = 0 put_num: 759 put_num: Que size = get_num: 759 get_num: Que size = 0 0 put_num: 760 put_num: Que size = 1 get_num: 760 get_num: Que size = 0 put_num: 761 put_num: Que size = get_num: 761 get_num: Que size = 0 0 Closing down Press enter to Quit: _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor