void* producer(void* arg) { Chan* writer; int* buf; int id; id = GETID(arg); printf("Producer %d starting"ENDL,id); writer = Chan_Open(GETCHAN(arg),CHAN_WRITE); buf = (int*)Chan_Token_Buffer_Alloc(writer); do { buf[0] = InterlockedIncrement(&item); usleep(1); usleep(1); printf("Producer: item %4d [ + ] %d"ENDL, buf[0], id); #pragma omp critical { mymax(&pmax,*buf); } Chan_Next(writer,(void**)&buf,sizeof(int)); } while(!stop); Chan_Token_Buffer_Free(buf); Chan_Close(writer); printf("Producer %d exiting"ENDL,id); return NULL; }
unsigned int Terminator::run(IDevice *d) { Chan **q; // input queues (all input channels) void **buf; // array of token buffers size_t *szs; // array of buffer sizes unsigned int i, n, any; n = d->_in->nelem; q = (Chan **) (Guarded_Malloc(n*sizeof(Chan*), "Worker device task - Terminator")); buf = (void**) (Guarded_Malloc(n * sizeof(void*), "Worker device task - Terminator")); szs = (size_t*) (Guarded_Malloc(n * sizeof(size_t), "Worker device task - Terminator")); // alloc the token buffers for (i = 0; i < n; i++) { q[i] = Chan_Open(d->_in->contents[i],CHAN_READ); buf[i] = Chan_Token_Buffer_Alloc(q[i]); szs[i] = Chan_Buffer_Size_Bytes(q[i]); } // main loop do { #if 0 if( !Chan_Is_Empty(q[0]) ) DBG("Convenient break point\r\n"); #endif any=0; for(i=0;i<n;++i) { any |= CHAN_SUCCESS(Chan_Next(q[i],buf+i,szs[i])); szs[i] = Chan_Buffer_Size_Bytes(q[i]); } } while(any); // quits when all inputs fail to pop // cleanup for (i = 0; i < n; i++) { Chan_Token_Buffer_Free(buf[i]); Chan_Close(q[i]); } free(buf); return 0; // success }
int main(int argc,char* argv[]) { Chan *chan; Thread* threads[N]; input_t inputs[N]; stop=0; item=0; chan = Chan_Alloc(16,sizeof(int)); stop=0; { size_t i; ThreadProc procs[N] = { consumer, consumer, consumer, consumer, producer, producer, producer, producer, producer, }; for(i=0;i<N;++i) { inputs[i].id = i; inputs[i].chan = chan; } for(i=0;i<N;++i) { threads[i] = Thread_Alloc(procs[i],(void*)(inputs+i)); usleep(10); } } //usleep(100); Chan_Wait_For_Ref_Count(chan,N+1); stop=1; printf("*** Main: triggered stop ***"ENDL); { int i=0; for(i=0;i<N;++i) Thread_Join(threads[i]); } Chan_Close(chan); printf("Balance: (%d,%d) %s"ENDL,pmax,cmax,(pmax==cmax)?"Ok!":"Mismatch *****"); return 0; }
void* consumer(void* arg) { Chan* reader; int* buf,id; id = GETID(arg); printf("Consumer %d starting\n",id); reader = Chan_Open(GETCHAN(arg),CHAN_READ); buf = (int*)Chan_Token_Buffer_Alloc(reader); while(CHAN_SUCCESS(Chan_Next(reader,(void**)&buf,sizeof(int)))) { //i=InterlockedDecrement(&item); printf("Consumer: item %4d [ - ] %d"ENDL, buf[0], id); #pragma omp critical { mymax(&cmax,buf[0]); } } Chan_Token_Buffer_Free(buf); Chan_Close(reader); printf("Consumer %d exiting"ENDL,id); return NULL; }