- File:
-
- 1 edited
-
src/tests/concurrent/examples/boundedBufferINT.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/tests/concurrent/examples/boundedBufferINT.c
r58caf150 r88f15ae 8 8 // Created On : Mon Oct 30 12:45:13 2017 9 9 // Last Modified By : Peter A. Buhr 10 // Last Modified On : Fri Apr 20 22:18:18 201811 // Update Count : 7810 // Last Modified On : Tue Jan 2 12:18:18 2018 11 // Update Count : 33 12 12 // 13 13 14 #include <stdlib> // random15 #include <fstream> 14 #include <stdlib> 15 #include <fstream> // random 16 16 #include <kernel> 17 17 #include <thread> 18 18 #include <unistd.h> // getpid 19 19 20 //Duration default_preemption() { return 0; }21 22 enum { BufferSize = 50 };23 24 forall( otype T )25 20 monitor Buffer { 26 21 condition full, empty; 27 22 int front, back, count; 28 T elements[BufferSize];23 int elements[20]; 29 24 }; 30 25 31 forall( otype T ) 32 void ?{}( Buffer(T) & buffer ) with( buffer ) { [front, back, count] = 0; } 26 void ?{}( Buffer & buffer ) { 27 buffer.front = buffer.back = buffer.count = 0; 28 } 33 29 34 forall( otype T ) 35 int query( Buffer(T) & buffer ) { return buffer.count; } 30 int query( Buffer & buffer ) { return buffer.count; } 36 31 37 forall( otype T ) 38 void insert( Buffer(T) & mutex buffer, T elem ) with( buffer ) { 39 if ( count == BufferSize ) wait( empty ); 32 void insert( Buffer & mutex buffer, int elem ) with( buffer ) { 33 if ( count == 20 ) wait( empty ); 40 34 elements[back] = elem; 41 back = ( back + 1 ) % BufferSize;35 back = ( back + 1 ) % 20; 42 36 count += 1; 43 37 signal( full ); 44 38 } 45 39 46 forall( otype T ) 47 T remove( Buffer(T) & mutex buffer ) with( buffer ) { 40 int remove( Buffer & mutex buffer ) with( buffer ) { 48 41 if ( count == 0 ) wait( full ); 49 Telem = elements[front];50 front = ( front + 1 ) % BufferSize;42 int elem = elements[front]; 43 front = ( front + 1 ) % 20; 51 44 count -= 1; 52 45 signal( empty ); … … 54 47 } 55 48 56 const int Sentinel = -1;57 58 49 thread Producer { 59 Buffer (int)& buffer;50 Buffer & buffer; 60 51 unsigned int N; 61 52 }; 62 void main( Producer & prod ) with( prod ){63 for ( int i = 1; i <= N; i += 1 ) {53 void main( Producer & prod ) { 54 for ( int i = 1; i <= prod.N; i += 1 ) { 64 55 yield( random( 5 ) ); 65 insert( buffer, 1 );56 insert( prod.buffer, 1 ); 66 57 } // for 58 insert( prod.buffer, -1 ); 67 59 } 68 void ?{}( Producer & prod, Buffer (int) * buffer,int N ) {60 void ?{}( Producer & prod, Buffer * buffer, unsigned int N ) { 69 61 &prod.buffer = buffer; 70 62 prod.N = N; … … 72 64 73 65 thread Consumer { 74 Buffer (int)& buffer;75 int & sum; // summation of producer values66 Buffer & buffer; 67 int & sum; // summation of producer values 76 68 }; 77 void main( Consumer & cons ) with( cons ){78 sum = 0;69 void main( Consumer & cons ) { 70 cons.sum = 0; 79 71 for ( ;; ) { 80 72 yield( random( 5 ) ); 81 int item = remove( buffer );82 if ( item == Sentinel ) break;// sentinel ?83 sum += item;73 int item = remove( cons.buffer ); 74 if ( item == -1 ) break; // sentinel ? 75 cons.sum += item; 84 76 } // for 85 77 } 86 void ?{}( Consumer & cons, Buffer (int) * buffer, int &sum ) {78 void ?{}( Consumer & cons, Buffer * buffer, int * sum ) { 87 79 &cons.buffer = buffer; 88 &cons.sum = ∑80 &cons.sum = sum; 89 81 } 90 82 91 83 int main() { 92 Buffer (int)buffer;93 enum { Prods = 4, Cons = 5 };84 Buffer buffer; 85 enum { Prods = 5, Cons = 5 }; 94 86 Producer * prods[Prods]; 95 87 Consumer * cons[Cons]; 88 const int Sentinel = -1; 96 89 int sums[Cons]; 97 90 int i; … … 101 94 srandom( 1003 ); 102 95 103 for ( i = 0; i < Cons; i += 1 ) { // create consumers104 cons[i] = new( &buffer, sums[i] );96 for ( i = 0; i < Cons; i += 1 ) { // create consumers 97 cons[i] = new( &buffer, &sums[i] ); 105 98 } // for 106 for ( i = 0; i < Prods; i += 1 ) { // create producers107 prods[i] = new( &buffer, 100000 );99 for ( i = 0; i < Prods; i += 1 ) { // create producers 100 prods[i] = new( &buffer, 100000u ); 108 101 } // for 109 102 110 for ( i = 0; i < Prods; i += 1 ) { // wait for producers to finish103 for ( i = 0; i < Prods; i += 1 ) { // wait for producers to finish 111 104 delete( prods[i] ); 112 105 } // for 113 for ( i = 0; i < Cons; i += 1 ) { // generate sentinal values to stop consumers106 for ( i = 0; i < Cons; i += 1 ) { // generate sentinal values to stop consumers 114 107 insert( buffer, Sentinel ); 115 108 } // for 116 109 int sum = 0; 117 for ( i = 0; i < Cons; i += 1 ) { // wait for consumers to finish110 for ( i = 0; i < Cons; i += 1 ) { // wait for consumers to finish 118 111 delete( cons[i] ); 119 112 sum += sums[i]; … … 124 117 // Local Variables: // 125 118 // tab-width: 4 // 126 // compile-command: "cfa boundedBuffer INT.c" //119 // compile-command: "cfa boundedBuffer.c" // 127 120 // End: //
Note:
See TracChangeset
for help on using the changeset viewer.