Guest User

Untitled

a guest
May 24th, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.90 KB | None | 0 0
  1. use std::sync::{Arc, RwLock};
  2. use std::thread;
  3. use std::time::Duration;
  4.  
  5.  
  6. // Reduzierter Server mit einer gemeinsamen Ressource `data`
  7. struct Server {
  8. data: Arc<RwLock<usize>>,
  9. }
  10.  
  11. impl Server {
  12. fn new() -> Self {
  13. Server {
  14. data: Arc::new(RwLock::new(0)),
  15. }
  16. }
  17.  
  18. // Auch einmalige Aktionen können in `loop` threads ausgeführt werden.
  19. // Hier ist aber wichtig das wenn. die Aktion erfolgreich war,
  20. // der loop mit `break` unterbrochen wird.
  21. //
  22. // ```
  23. // thread::spawn(move || loop {
  24. // if let Ok(data) = data.write() {
  25. // *data = 0000;
  26. // break;
  27. // }
  28. // });
  29. // ```
  30. //
  31. // Alternative kann auch der `loop` weg gelassen werden. Dann muss aber
  32. // eine `while let` Anweisung Anstelle der `if let` verwendet werden.
  33. //
  34. // ```
  35. // thread::spawn(move || {
  36. // while let Ok(data) = data.write() {
  37. // *data = 0000;
  38. // break;
  39. // }
  40. // });
  41. // ```
  42. //
  43. // In der zweiten Version wird der `loop` nur einfach verschoben.
  44.  
  45.  
  46. // Der erste Thread soll data ein mal schreiben
  47. fn start_thread0(&self) {
  48. let data = self.data.clone();
  49. thread::spawn(move || {
  50. // warte 3ms und versuche dann die data zu schreiben
  51. thread::sleep(Duration::from_millis(3));
  52. while let Ok(mut data) = data.write() {
  53. println!(">> thread 0 write");
  54. *data = 9999;
  55. break;
  56. }
  57. });
  58. }
  59.  
  60. // Der zweite Thread, der Hauptthread, schreibt unentwegt data.
  61. // Dabei blockiert der Thread nach jedem schreiben für 10ms, damit der lock
  62. // nicht gleich wieder frei gegeben wird.
  63. fn start_thread1(&self) {
  64. let data = self.data.clone();
  65. thread::spawn(move || loop {
  66. if let Ok(mut data) = data.write() {
  67. println!("thread 1 write");
  68. *data += 1;
  69. thread::sleep(Duration::from_millis(10));
  70. }
  71. // dieses sleep ist sehr wichtig. In dieser 1ms bekommen die anderen
  72. // thread die Möglichkeit ausgeführt zu werden.
  73. thread::sleep(Duration::from_millis(1));
  74. });
  75. }
  76.  
  77. // Der dritte Thread liest die gemeinsame Ressource alle 30ms
  78. fn start_thread2(&self) {
  79. let data = self.data.clone();
  80. thread::spawn(move || loop {
  81. if let Ok(data) = data.read() {
  82. println!("thread 2 read");
  83. println!("\t|_data: {}", data);
  84. }
  85. thread::sleep(Duration::from_millis(30));
  86. });
  87. }
  88. }
  89.  
  90.  
  91. fn main() {
  92. let server = Server::new();
  93. // schreiben, ein mal
  94. server.start_thread0();
  95. // schreiben
  96. server.start_thread1();
  97. // lesen
  98. server.start_thread2();
  99.  
  100. // Alles läuft in diesem Beispiel 100ms
  101. thread::sleep(Duration::from_millis(100));
  102. }
Add Comment
Please, Sign In to add comment