from threading import * import random import time procs_running = 0 procs_running_mutex = Lock() class Proc(Thread): def run(self): it = self.start_block; end = self.end_block; name = self.getName() for i in range(self.iterations): self.request_block(name,it); it = it + 100; self.finish() def finish(self): global procs_running_mutex,procs_running procs_running_mutex.acquire() # critical section entry procs_running = procs_running - 1; procs_running_mutex.release() # critical section exit print self.getName(),"finished" def start(self): global procs_running_mutex,procs_running print self.getName(),"starting" procs_running_mutex.acquire() # critical section entry procs_running = procs_running + 1; procs_running_mutex.release() # critical section exit Thread.start(self) def __init__(self, n, r, k, s, e): self.request_block = r; self.iterations = k self.start_block = s; self.end_block = e Thread.__init__(self, group=None, target=None, name=n, args=(self)) self.setDaemon(1) class RandomSeeker(Proc): def run(self): s = self.start_block; e = self.end_block; name = self.getName() for i in range(self.iterations): self.request_block(name,random.randint(s, e)) self.finish() def __init__(self, n, r, k, s, e): self.request_block = r; self.iterations = k Proc.__init__(self, n, r, k, s, e) class BisectionSeeker(Proc): def run(self): s = self.start_block; e = self.end_block; name = self.getName() for i in range(self.iterations): m = int((s + e) / 2) if (m == s): break self.request_block(name,m) (s, e) = random.choice([(s, m), (m, e)]); self.finish() def __init__(self, n, r, k, s, e): self.request_block = r; self.iterations = k Proc.__init__(self, n, r, k, s, e) class ColumnMajor(Proc): def run(self): s = self.start_block; e = self.end_block; name = self.getName() for i in range(self.iterations): self.request_block(name,(s / 100) + (s % 100) * 100) s = s + 1; self.finish() def __init__(self, n, r, k, s, e): self.request_block = r; self.iterations = k Proc.__init__(self, n, r, k, s, e)