The Apprentice Challenge J Strother Moore Department of Computer - - PowerPoint PPT Presentation

the apprentice challenge
SMART_READER_LITE
LIVE PREVIEW

The Apprentice Challenge J Strother Moore Department of Computer - - PowerPoint PPT Presentation

The Apprentice Challenge J Strother Moore Department of Computer Sciences University of Texas at Austin 1 A Class Involving Multiple Threads class Container { public int counter; } class Job extends Thread { Container objref; public void


slide-1
SLIDE 1

The Apprentice Challenge

J Strother Moore Department of Computer Sciences University of Texas at Austin

1

slide-2
SLIDE 2

A Class Involving Multiple Threads

class Container { public int counter; } class Job extends Thread { Container objref; public void setref(Container o) {

  • bjref = o; }

2

slide-3
SLIDE 3

public Job incr () { synchronized(objref) {

  • bjref.counter = objref.counter + 1; }

return this; } public void run() { for (;;) {incr(); } } }

3

slide-4
SLIDE 4

class Apprentice { public static void main(String[] args){ Container container = new Container(); for (;;) {Job job = new Job(); job.setref(container); job.start(); } } }

4

slide-5
SLIDE 5

Theorem The value of the counter never decreases. This has to be formulated more carefully to account for Java’s 32-bit int arithmetic.

5

slide-6
SLIDE 6

Theorem (let* ((s1 (run sched *a0*)) (s2 (step th s1))) (or (equal (counter s1) nil) (equal (counter s1) (counter s2)) (equal (int-fix (+ 1 (counter s1))) (counter s2))))

6

slide-7
SLIDE 7

It’s Obvious...

class Container {public int counter; } class Job extends Thread { Container objref; public void setref(Container o) {objref = o; } public Job incr () { synchronized(objref){

  • bjref.counter = objref.counter + 1;}

return this; } public void run() { for (;;) {incr(); } } } class Apprentice { public static void main(String[] args){ Container container = new Container(); for (;;) {Job job = new Job(); job.setref(container); job.start(); } } }

7

slide-8
SLIDE 8

class Container {public int counter; } class Job extends Thread { Container objref; public void setref(Container o) {objref = o; } public Job incr () { synchronized(objref) {objref.counter = objref.counter + 1; } return this; } public void run() { for (;;) {incr(); } } } class Apprentice { public static void main(String[] args){ Container container = new Container(); Container bogus = new Container(); for (;;) {Job job = new Job(); job.setref(bogus); job.start(); job.setref(container); } } }

8

slide-9
SLIDE 9

Heap Thread Table Class Table

Thread 0 Job incr() synchronized(objref) {objref.counter = objref.counter + 1;} Apprentice main() Container container = new Container(); Container bogus = new Container() for (;;) { Job job = new Job(); job.setref(bogus); job.start(); job.setref(container);}

9

slide-10
SLIDE 10

Heap Class Table

Thread 0 −−− −−− container counter: monitor: container counter: monitor:

Thread Table

Job incr() synchronized(objref) {objref.counter = objref.counter + 1;} Apprentice main() Container container = new Container(); Container bogus = new Container() for (;;) { Job job = new Job(); job.setref(bogus); job.start(); job.setref(container);}

10

slide-11
SLIDE 11
  • Heap

Thread Table Class Table

Thread 1 Thread 0 −−− −−− container counter: monitor: container counter: monitor: Job1

  • bjref:

Job job = new Job(); Job incr() synchronized(objref) {objref.counter = objref.counter + 1;} Apprentice main() Container container = new Container(); Container bogus = new Container() job.setref(bogus); job.start(); job.setref(container);} for (;;) {

u n s c h e d u l e d

11

slide-12
SLIDE 12
  • Heap

Thread Table Class Table

Thread 1 Thread 0 −−− −−− container counter: monitor: container counter: monitor: Job1

  • bjref:

Job job = new Job(); Job incr() synchronized(objref) {objref.counter = objref.counter + 1;} Apprentice main() Container container = new Container(); Container bogus = new Container() job.setref(bogus); job.start(); job.setref(container);} for (;;) {

u n s c h e d u l e d

12

slide-13
SLIDE 13

Heap Thread Table Class Table

Thread 1 Thread 0 −−− −−− container counter: monitor: container counter: monitor: Job1

  • bjref:

Job job = new Job(); Job incr() synchronized(objref) {objref.counter = objref.counter + 1;} Apprentice main() Container container = new Container(); Container bogus = new Container() job.setref(bogus); job.start(); job.setref(container);} for (;;) {

13

slide-14
SLIDE 14

Heap Thread Table Class Table

Thread 1 Thread 0 −−− container counter: monitor: container counter: monitor: Job1

  • bjref:

Job job = new Job(); −−− Job incr() synchronized(objref) {objref.counter = objref.counter + 1;} Apprentice main() Container container = new Container(); Container bogus = new Container() job.setref(bogus); job.start(); for (;;) { job.setref(container);}

14

slide-15
SLIDE 15

Heap Thread Table Class Table

Thread 1 Thread 0 −−− container counter: monitor: container counter: monitor: Job1

  • bjref:

Job job = new Job(); Thread 1

  • bjref.counter + 1;}

Job incr() synchronized(objref) Apprentice main() Container container = new Container(); Container bogus = new Container() job.setref(bogus); job.start(); job.setref(container);} for (;;) { {objref.counter =

15

slide-16
SLIDE 16

Heap Thread Table Class Table

Thread 1 Thread 0 −−− container counter: monitor: container counter: monitor: Job1

  • bjref:

Job job = new Job(); Thread 1

  • bjref.counter + 1;}

1

Job incr() synchronized(objref) {objref.counter = Apprentice main() Container container = new Container(); Container bogus = new Container() job.setref(bogus); job.start(); job.setref(container);} for (;;) {

16

slide-17
SLIDE 17

Heap Thread Table Class Table

Thread 1 Thread 0 −−− container counter: monitor: container counter: monitor: Job1

  • bjref:

Job job = new Job(); Thread 1

  • bjref.counter + 1;}

1

Job incr() synchronized(objref) {objref.counter = Apprentice main() Container container = new Container(); Container bogus = new Container() job.setref(bogus); job.start(); job.setref(container);} for (;;) {

17

slide-18
SLIDE 18

Heap Thread Table Class Table

Thread 1 Thread 0 −−− container counter: monitor: container counter: monitor: Job1

  • bjref:

Job job = new Job(); Thread 1

  • bjref.counter + 1;}

1

Job incr() synchronized(objref) {objref.counter = Apprentice main() Container container = new Container(); Container bogus = new Container() job.setref(bogus); job.start(); job.setref(container);} for (;;) {

18

slide-19
SLIDE 19

Heap Thread Table Class Table

Thread 1 Thread 0 −−− container counter: monitor: container counter: monitor: Job job = new Job(); Thread 1

  • bjref.counter + 1;}

1

Thread 2 Job1

  • bjref:

Job2

  • bjref:

Job incr() synchronized(objref) {objref.counter = Apprentice main() Container container = new Container(); Container bogus = new Container() job.setref(bogus); job.start(); job.setref(container);} for (;;) {

19

slide-20
SLIDE 20

Heap Thread Table Class Table

Thread 1 Thread 0 1000000 container counter: monitor: container counter: monitor: Thread 1

1

Thread 2 Job1

  • bjref:

Job2

  • bjref:

Thread 2

  • bjref.counter + 1;}

Job incr() synchronized(objref) {objref.counter =

  • bjref.counter + 1;}

Job incr() synchronized(objref) {objref.counter =

20

slide-21
SLIDE 21

Heap Thread Table Class Table

Thread 1 Thread 0 1000000 container counter: monitor: container counter: monitor: Thread 1 Thread 2 Job1

  • bjref:

Job2

  • bjref:

Thread 2

  • bjref.counter + 1;}

1

Job incr() synchronized(objref) {objref.counter =

  • bjref.counter + 1;}

Job incr() synchronized(objref) {objref.counter =

21

slide-22
SLIDE 22

Heap Thread Table Class Table

Thread 1 Thread 0 1000000 container counter: monitor: container counter: monitor: Thread 1 Thread 2 Job1

  • bjref:

Job2

  • bjref:

Thread 2

  • bjref.counter + 1;}

Job incr() synchronized(objref) {objref.counter =

  • bjref.counter + 1;}

Job incr() synchronized(objref) {objref.counter =

1

22

slide-23
SLIDE 23

class Container { public int counter; } class Job extends Thread { Container objref; public void setref(Container o) {objref = o; } public Job incr () { synchronized(objref) {objref.counter = objref.counter + 1; } return this; } public void run() { for (;;) {incr(); } } } class Apprentice { public static void main(String[] args){ Container container = new Container(); for (;;) {Job job = new Job(); job.setref(container); job.start(); } } }

23

slide-24
SLIDE 24

Theorem (let* ((s1 (run sched *a0*)) (s2 (step th s1))) (rel (counter s1) (counter s2)))

24

slide-25
SLIDE 25

(defthm Lemma-1 (good-state *a0*)) (defthm Lemma-2 (implies (good-state s) (good-state (step th s)))) (defthm Lemma-3 (implies (good-state s) (rel (counter s) (counter (step th s)))))

25