I have encountered a strange problem with semaphores.
I'm trying to synchronize several writer-processes which write to a
shared-memory-segment.
therefore they are able to lock their write-procedure via a binary
semaphore. the problem
is when one of the servers terminates, the oncetime binary-semaphore
gets incremented to something
greater then 1.
I've tried to change the sem_flg flag of the sembuf structure, with no
success.
Any hints????
TIA
Andre
<snip>
int Writer::Run()throw(SemaphoreError){
int i;
pid_t pid = getpid();
semun arg;
struct sembuf sop_acquire, //sembuf-struct zur
Dekrementierung der Semaphore
sop_release; //sembuf-struct zur
Inkrementierung der Semaphore
semun semun_arg;
//Initialisierung der sembuf-struktur sop_acquire
sop_acquire.sem_num = WAS;
sop_acquire.sem_op = -1;
sop_acquire.sem_flg = SEM_UNDO;
sop_release.sem_num = WAS;
sop_release.sem_op = 1;
sop_release.sem_op = SEM_UNDO;
while (1){
#ifdef _DEBUG
cout << "Before Acquiring: " <<
semctl(semid,WAS,GETVAL,arg) << endl << flush;
#endif
if(semop(semid,&sop_acquire,1)==-1){
throw SemaphoreError();
};
#ifdef _DEBUG
cout << "Locked State : " <<
semctl(semid,WAS,GETVAL,arg) << endl << flush;
#endif
//BEGIN kritischer Abschnitt
(*db) = i = (rand()%20);
cout << pid << ": Just wrote " << (*db) << " into
database\n";
cout << "Reader_Semaphore : " <<
semctl(semid,RES,GETVAL,semun_arg) << " Writer-Semaphore : " <<
semctl(semid,WRS,GETVAL,semun_arg) << endl;
//ENDE kritischer Abschnitt
if(semop(semid,&sop_release,1)==-1){
throw SemaphoreError();
};
#ifdef _DEBUG
cout << "After Release : "
<<semctl(semid,WAS,GETVAL,arg) << endl << flush;
#endif
sleep(i%2);
};
return (1);
</snip>Quote:}