source: tests/concurrency/examples/boundedBufferTHREAD.cfa@ 00aa122

Last change on this file since 00aa122 was 0048327, checked in by Peter A. Buhr <pabuhr@…>, 4 weeks ago

change use of random to prng

  • Property mode set to 100644
File size: 2.9 KB
RevLine 
[d38c4b4]1//
2// Cforall Version 1.0.0 Copyright (C) 2018 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
[aca144e]7// boundedBufferTHREAD.c --
[d38c4b4]8//
9// Author : Peter A. Buhr
10// Created On : Wed Apr 18 22:52:12 2018
11// Last Modified By : Peter A. Buhr
[0048327]12// Last Modified On : Wed Nov 5 08:05:24 2025
13// Update Count : 28
[d38c4b4]14//
15
16#include <fstream.hfa>
17#include <kernel.hfa>
18#include <thread.hfa>
19#include <unistd.h> // getpid
20
21//Duration default_preemption() { return 0; }
22
23enum { BufferSize = 50 };
24
25//forall( otype T ) {
26 thread Buffer {
27 int front, back, count;
28 int elements[BufferSize];
29 }; // Buffer
30
31 void ?{}( Buffer & buffer ) with( buffer ) { [front, back, count] = 0; }
32
33 int query( Buffer & buffer ) { return buffer.count; } // read-only, no mutual exclusion
34
35 void insert( Buffer & mutex buffer, int elem ) with( buffer ) {
36 elements[back] = elem;
37 } // insert
38
39 int remove( Buffer & mutex buffer ) with( buffer ) {
40 return elements[front];
41 } // remove
42
43 void main( Buffer & buffer ) with( buffer ) {
44 for () {
[cca568e]45 waitfor( ^?{} : buffer ) {
[d38c4b4]46 break;
[cca568e]47 } or when ( count != 20 ) waitfor( insert : buffer ) {
[d38c4b4]48 back = (back + 1) % 20;
49 count += 1;
[cca568e]50 } or when ( count != 0 ) waitfor( remove : buffer ) {
[d38c4b4]51 front = (front + 1) % 20;
52 count -= 1;
53 } // waitfor
54 } // for
55 } // main
56//}
57
58enum { Sentinel = -1 };
59
60thread Producer {
61 Buffer & buffer;
62 unsigned int N;
63};
64void main( Producer & prod ) with( prod ) {
65 for ( i; 1 ~= N ) {
[0048327]66 yield( prng( 5 ) );
[d38c4b4]67 insert( buffer, 1 );
68 } // for
69}
70void ?{}( Producer & prod, Buffer * buffer, int N ) {
71 &prod.buffer = buffer;
72 prod.N = N;
73}
74
75thread Consumer {
76 Buffer & buffer;
77 int & sum; // summation of producer values
78};
79void main( Consumer & cons ) with( cons ) {
80 sum = 0;
81 for () {
[0048327]82 yield( prng( 5 ) );
[d38c4b4]83 int item = remove( buffer );
84 if ( item == Sentinel ) break; // sentinel ?
85 sum += item;
86 } // for
87}
88void ?{}( Consumer & cons, Buffer * buffer, int & sum ) {
89 &cons.buffer = buffer;
90 &cons.sum = &sum;
91}
92
93int main() {
94 Buffer buffer;
95 enum { Prods = 4, Cons = 5 };
96 Producer * prods[Prods];
97 Consumer * cons[Cons];
98 int sums[Cons];
99 int i;
100 processor p;
101
[0048327]102 set_seed( 1003 );
[d38c4b4]103
104 for ( i; Cons ) { // create consumers
[0048327]105 cons[i] = new( &buffer, sums[i] ); // NEW CANNOT HANDLE BUFFER REFERENCE
[d38c4b4]106 } // for
107 for ( i; Prods ) { // create producers
108 prods[i] = new( &buffer, 100000 );
109 } // for
110
111 for ( i; Prods ) { // wait for producers to finish
112 delete( prods[i] );
113 } // for
114 for ( i; Cons ) { // generate sentinal values to stop consumers
115 insert( buffer, Sentinel );
116 } // for
117 int sum = 0;
118 for ( i; Cons ) { // wait for consumers to finish
119 delete( cons[i] );
120 sum += sums[i];
121 } // for
122 sout | "total:" | sum;
123}
124
125// Local Variables: //
126// tab-width: 4 //
127// compile-command: "cfa boundedBufferTHREAD.cfa" //
128// End: //
Note: See TracBrowser for help on using the repository browser.