Adding example code in converse tutorial for threads
[charm.git] / doc / converse / code / cth-tutorial / pgm.C
1 #include <stdio.h>
2 #include "converse.h"
3
4 #define HIGH_PRIO 0
5 #define LOW_PRIO 1
6 #define NUM_YIELD 10
7
8 int endCounter = 0;
9
10 //determine completion based on threads calling it
11 void threadDone() {
12   endCounter++;
13   if(endCounter == 2) {
14     CsdExitScheduler();
15   }
16 }
17
18 //worker function for worker1
19 //yields with a low priority
20 void worker1Work(void* msg) {
21   printf("start worker1\n");
22   CthYield();
23   printf("worker1 resumed first time\n");
24   unsigned int prio  = LOW_PRIO;
25   for(int i = 0; i < NUM_YIELD; i++) {
26     CthYieldPrio(CQS_QUEUEING_IFIFO,0,&prio);
27     printf("worker1 resumed %dth time\n",i);
28   }
29   threadDone();
30 }
31
32 //worker function for worker2
33 //yields with a high priority
34 void worker2Work(void* msg) {
35   printf("start worker2\n");
36   CthYield();
37   printf("worker2 resumed first time\n");
38   unsigned int prio  = HIGH_PRIO;
39   for(int i = 0; i < NUM_YIELD; i++) {
40     CthYieldPrio(CQS_QUEUEING_IFIFO,0,&prio);
41     printf("worker2 resumed %dth time\n",i);
42   }
43   threadDone();
44 }
45
46 //create two worker threads and push them on scheduler Q
47 void initThreads(int argc, char* argv[]) {
48   printf("called initThreads\n");
49   CthThread worker1 = CthCreateMigratable((CthVoidFn)worker1Work, 0, 160000);
50   CthThread worker2 = CthCreateMigratable((CthVoidFn)worker2Work, 0, 160000);
51   CthAwaken(worker1);
52   CthAwaken(worker2);
53 }
54
55 int main(int argc, char* argv[]) {
56   //initialize converse and calls initThreads
57   ConverseInit(argc, argv, initThreads, 0, 0);
58 }