Guest User

Untitled

a guest
May 27th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.21 KB | None | 0 0
  1. #![feature(integer_atomics)]
  2. use std::cell::RefCell;
  3. use std::thread;
  4. use std::io;
  5.  
  6. extern crate crossbeam;
  7. use crossbeam::sync::MsQueue;
  8. use crossbeam::scope;
  9.  
  10. extern crate time;
  11.  
  12. struct Point {
  13. x: i64
  14. }
  15.  
  16. use std::sync::atomic::{AtomicUsize, AtomicPtr, Ordering};
  17. use std::mem;
  18. use std::ptr;
  19. use std::boxed::Box;
  20.  
  21. struct Node<T> {
  22. cells: [AtomicPtr<T>; 4],
  23. next: AtomicPtr<Node<T>>
  24. }
  25.  
  26. struct Queue_<T> {
  27. node: Node<T>,
  28.  
  29. put_index: AtomicUsize,
  30. pop_index: AtomicUsize,
  31. default_T: AtomicPtr<T>,
  32. default_node: AtomicPtr<Node<T>>
  33. }
  34.  
  35. fn test_scoped_thread() {
  36. let node: Node<Point> = Node { cells: [AtomicPtr::default(), AtomicPtr::default()
  37. , AtomicPtr::default(), AtomicPtr::default()], next: AtomicPtr::default()};
  38. let queue: Queue_<Point> = Queue_ {node: node, put_index: AtomicUsize::new(0)
  39. , pop_index: AtomicUsize::new(0)
  40. , default_T: AtomicPtr::default()
  41. , default_node: AtomicPtr::default()};
  42. let shared_queue = &queue;
  43. println!("");
  44. scope(|scope| {
  45. scope.spawn(move || {
  46. let shared_node = &shared_queue.node;
  47. let mut vals: [usize; 4] = [0, 0, 0, 0];
  48.  
  49. for i in 0..4 {
  50. let put_index = shared_queue.put_index.fetch_add(1, Ordering::Relaxed);
  51. if shared_queue.default_T.load(Ordering::Relaxed) == shared_node.cells[put_index].load(Ordering::Relaxed) {
  52. shared_node.cells[put_index].compare_and_swap(shared_queue.default_T.load(Ordering::Relaxed), &mut Point{x: i}, Ordering::Relaxed);
  53. }
  54. }
  55.  
  56. thread::sleep_ms(3000);
  57. println!("over");
  58. });
  59. thread::sleep_ms(1000);
  60. scope.spawn(move || {
  61. let shared_node = &shared_queue.node;
  62. for _ in 0..4 {
  63. let pop_index = shared_queue.pop_index.fetch_add(1, Ordering::Relaxed);
  64. let val = &shared_node.cells[pop_index];
  65. while shared_queue.default_T.load(Ordering::Relaxed) == val.load(Ordering::Relaxed){
  66. // println!("value is {:?}", val.load(Ordering::Relaxed));
  67. }
  68. println!("value address is {:?} ", val.load(Ordering::Relaxed));
  69.  
  70. let vp = unsafe{ &*val.load(Ordering::Relaxed) };
  71. println!("value is {}", vp.x );
  72. }
  73. });
  74. });
  75.  
  76. println!("put {}", shared_queue.put_index.load(Ordering::Relaxed));
  77. println!("put {}", shared_queue.put_index.load(Ordering::Relaxed));
  78. }
  79.  
  80. fn test_vec() {
  81. // 迭代器可以收集到 vector
  82. let mut collected_iterator: Vec<i32> = (2..10).collect();
  83. println!("Collected (0..10) into: {:?}", collected_iterator);
  84.  
  85. // `vec!` 宏可用来初始化一个 vector
  86. let mut xs = vec![1i32, 2, 3];
  87. println!("Initial vector: {:?}", xs);
  88.  
  89. // 在 vector 的尾部插入一个新的元素
  90. println!("Push 4 into the vector");
  91. xs.push(4);
  92. println!("Vector: {:?}", xs);
  93.  
  94. // 报错!不可变 vector 不可增长
  95. {
  96. for i in 1..10 {
  97. let m = i;
  98. collected_iterator.push(m);
  99. }
  100. }
  101. // 改正 ^ 将此行注释掉
  102.  
  103. // `len` 方法获得一个 vector 的当前大小
  104. println!("Vector size: {}", xs.len());
  105.  
  106. // 在中括号上加索引(索引从 0 开始)
  107. println!("Second element: {}", xs[1]);
  108.  
  109. // `pop` 移除 vector 的最后一个元素并将它返回
  110. println!("Pop last element: {:?}", xs.pop());
  111.  
  112. // 超出索引范围将抛出一个 panic
  113. // println!("Fourth element: {}", xs[3]);
  114.  
  115. println!("one: {:?}", collected_iterator.pop());
  116. println!("one: {:?}", collected_iterator.pop());
  117.  
  118. }
  119.  
  120. fn test_crossbeam() {
  121. let q: MsQueue<i64> = MsQueue::new();
  122. assert!(q.is_empty());
  123. const CONC_COUNT: i64 = 100000000;
  124. const THREAD_NUM: i64 = 4;
  125. const CONC_C: i64 = CONC_COUNT / THREAD_NUM;
  126.  
  127. println!("\nstart");
  128. let start = time::now();
  129. scope(|scope| {
  130. for _ in 0..THREAD_NUM {
  131. scope.spawn(|| {
  132. for i in 0..CONC_C {
  133. q.push(i);
  134. q.try_pop();
  135. }
  136. });
  137. }
  138. });
  139. let end = time::now();//获取结束时间
  140.  
  141. println!("done!duration: {:?}\n", (end-start));
  142.  
  143. let j: i64 = 8;
  144. let k: Point = Point { x: j};
  145. println!("j : {} {}", k.x, j);
  146. }
  147.  
  148. fn main() {
  149. //test_scoped_thread();
  150. //test_vec();
  151. test_crossbeam();
  152. }
Add Comment
Please, Sign In to add comment