lecteurEcrivain_famineLecteur.csp 901 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. define NE 100
  2. define NL 100
  3. ECRIVAIN ==
  4. *[ true ->
  5. sleep (random(10,10000));
  6. ctrl ! block ();
  7. ctrl ! acces ();
  8. print("Writing ");
  9. ressource := ressource + 1;
  10. print(ressource);
  11. sleep (1000);
  12. print(" done.\n");
  13. ctrl ! libere ()
  14. ]
  15. LECTEUR ==
  16. *[ true ->
  17. ctrl ! acces ();
  18. print ("Read : " + ressource + "\n");
  19. ctrl ! libere ()
  20. ]
  21. CTRL ==
  22. lock : boolean := false;
  23. nl : integer := 0;
  24. *[
  25. (i:1..NL) not lock; lecteur[i] ? acces() -> nl := nl + 1; print("+ 1 : " + nl + " readers\n")
  26. []
  27. (i:1..NL) lecteur[i] ? libere () -> nl := nl - 1 ; print("- 1 : " + nl + " readers\n")
  28. []
  29. (i:1..NE) not lock; ecrivain[i] ? block () -> lock := true
  30. []
  31. (i:1..NE) lock & nl = 0; ecrivain[i] ? acces () ->
  32. ecrivain[i] ? libere();
  33. lock := false
  34. ]
  35. MAIN ==
  36. ressource : integer := 0;
  37. [
  38. ecrivain [i:1..NE] :: ECRIVAIN
  39. ||
  40. lecteur [i:1..NL] :: LECTEUR
  41. ||
  42. ctrl :: CTRL
  43. ]