221V 2 недель назад
Родитель
Сommit
e233fd4ad0
2 измененных файлов с 64 добавлено и 1 удалено
  1. 9 1
      vtest2/source/app.d
  2. 55 0
      vtest2/source/test7.d

+ 9 - 1
vtest2/source/app.d

@@ -47,10 +47,17 @@ import test5 : test5_spawner;
 */
 
 
+/*
 // test6
 import std.concurrency : spawn;
 
 import test6 : test6_spawner;
+*/
+
+// test7
+import std.concurrency : spawn;
+
+import test7 : test7_spawner;
 
 
 void main(){
@@ -59,7 +66,8 @@ void main(){
   //spawn(&test3_spawner); // test3 run
   //spawn(&test4_spawner); // test4 run
   //spawn(&test5_spawner); // test5 run
-  spawn(&test6_spawner); // test6 run
+  //spawn(&test6_spawner); // test6 run
+  spawn(&test7_spawner); // test7 run
   
   //Thread.sleep(dur!"seconds"(125));
   //Thread.sleep(dur!"seconds"(3));

+ 55 - 0
vtest2/source/test7.d

@@ -0,0 +1,55 @@
+
+
+alias uint8  = ubyte;
+alias uint64 = ulong;
+
+
+import std.stdio;
+
+import core.thread : Fiber;
+
+
+uint64 fact(uint64 n){
+  return fact(n, 1);
+}
+
+uint64 fact(uint64 n, uint64 a){
+  if(n == 0){
+    return a;
+  }else{
+    return fact(n - 1, n * a);
+  }
+}
+
+
+void test7_spawner(){
+  uint64[] inputs = [5, 7, 10, 3, 8];
+  uint64[] results = new uint64[inputs.length];
+  
+  Fiber[] fibers;
+  fibers.length = inputs.length;
+  
+  for(int i = 0; i < inputs.length; i++){
+    int index = i;
+    
+    fibers[i] = new Fiber({
+      results[index] = fact(inputs[index]);
+    });
+    
+    fibers[i].call();
+    writefln("fact(%s) = %s", inputs[i], results[i]);
+  }
+}
+
+/*
+
+./vtest2
+hello here!
+fact(5) = 120
+fact(7) = 5040
+fact(10) = 3628800
+fact(3) = 6
+fact(8) = 40320
+
+*/
+