Help C++ Semaphore

Status
Niet open voor verdere reacties.

galaxy22

Nieuwe gebruiker
Lid geworden
19 jun 2007
Berichten
3
hoi allen ik heb een probleem met deze code. Ik snap wel problemen maar hoe kan ik het verbeteren. ‘while loops’ dat producer en consumer synchroon communiceren.

Code:
#include <fcntl.h>
#include <semaphore.h>
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h> 
#include <sys/types.h>
#include <unistd.h>

sem_t *mySemaphore ;

#define BUFFERSIZE 1000000
char  boundedBuffer[BUFFERSIZE] ;    
int   filled = -1 , empty = -1 ;

void Produce(void *data) {
	int i = 0  ;
	while ( i < BUFFERSIZE ) {
		boundedBuffer[++filled] = 'A' ;
		i++ ;
	}
}

void Consume(void *data) {
	int i ;
	while ( i < BUFFERSIZE) {
		if ( boundedBuffer[++empty] != 'A' ) 
               printf("Error consume != A\n"); ;
		i++ ;
	}
}

int main(int argc, char * argv[]) {
	pthread_t	p1, p2 ;
	int l = 0 ; 

	mySemaphore = sem_open("MySemaphore",O_CREAT) ;
	
	for ( l = 0 ; l < BUFFERSIZE; l++) boundedBuffer[l] = '.' ;
	
/* Create our threads */
	pthread_create(&p1, NULL,(void *(*)(void *)) Produce, boundedBuffer);
	pthread_create(&p2, NULL,(void *(*)(void *)) Consume, boundedBuffer);

/* Wait for our threads */
	pthread_join(p1, NULL);
	pthread_join(p2, NULL);

	return 0 ;
}
 
Laatst bewerkt door een moderator:
ieder functie voor alleen 1 index maken en die functies in een while loop zetten?

je kunt niet 2 dingen tegelijk doen op een computer

edit:

p.s. for loops zijn overzichtelijker, jouw keuze though
 
" je kunt niet 2 dingen tegelijk doen op een computer" het is probleem.
Er moet voor eider functie op juiste moment(niet tegelijk) werken. Maar hoe? Kan je voorbeeld geven?
 
Laatst bewerkt:
hmm ik weet eigenlijk niet goed wat je priecies wilt doen, wat een semaphore is of hoe threads werken

wat ik ervan begreep wil je eerst een 'A' in je boundedbuffer zetten en hem dan eruit halen klopt dat?
 
je wil multi threaded werken.

het makelijkste om dit te doen is ubuntu te instaleren(grafishe linux).

en dan wat je wil doen te forken dan draaien ze allebei tegelijk.
 
Het programma is een foutieve implementatie van het producer/consumer probleem. Ik wil het verbeteren beide ‘while loops’ zodanig dat producer en consumer synchroon communiceren.

" wat ik ervan begreep wil je eerst een 'A' in je boundedbuffer zetten en hem dan eruit halen klopt dat?"

pricies wat ik wil.. maar het moet producer en consumer synchroon communiceren.
 
Laatst bewerkt:
mag het in 1 applicatie om een voor 1 of wil je dat het met twee verschillende apps gebeurt?
met 2 apps kun je wat mike zegt wel forken denk ik (heb ik niet zo'n ervaring mee)
@mike was fork niet ook een dos cmd?

ik weet niet wat je hiermee wilt maar je kunt ook winsock overwegen. hier kun je sockets maken die op elkaar wachten. host/client gwn 127.0.0.1 maken dan
 
Kun je voor zoiets niet beter een fifo (named pipe) maken... Het "luisterende" einde van de pipe wacht tot er data beschikbaar is.

p.s. De hele buffer vullen met puntjes kan sneller:

memset(&buffer, '.', BUFSIZE);
 
memset(&buffer, '.', sizeof(buffer)/sizeof(char));
om het goed te doen :P

enneh wrm zeg je puntjes? hij gebruikt 'A' een '.' is toch ook 8 bits of niet dan?
 
for ( l = 0 ; l < BUFFERSIZE; l++) boundedBuffer[l] = '.' ;


Dit zijn toch puntjes? Waarmee je de array vult...

En ja, 'A' en '.' zijn beide ASCII waardens dus 8bits/1byte
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan