Semaphoren in C

Problem:
Semaphoren blockieren unerwartet mein laufendes Programm

Situation:
ich habe mir eine Art Pipe gebastelt

ich erstelle 2 unbenannte Semaphoren:
S1(256) und S2(0)

dann habe ich 2 Methoden:
push(content) {
sem_wait(S1);
// füge content in pipe
sem_post(S2);
}
poll(*content) {
sem_wait(S2);
// hole content aus pipe
sem_post(S1);
}

diese Syntax sorgt dafür, dass genau 256 Plätze in der Pipe befüllbar sind und push blockiert wenn die Pipe voll ist bzw. poll blockiert, wenn die Pipe leer ist

Die unerwartete Blockade habe ich gedebuggt und herausgefunden, dass es im push, manchmal bei wait, manchmal beim post passiert, aber bisher immer wenn S1 auf 16 (vor dem wait) und S2 auf 240 ist

Hat jemand eine Idee?

S1(256) und S2(0)

push(content) {
sem_wait(S1);
// füge content in pipe
sem_post(S2);
}
poll(*content) {
sem_wait(S2);
// hole content aus pipe
sem_post(S1);
}

[…]

Die unerwartete Blockade habe ich gedebuggt und herausgefunden, dass es im push, manchmal bei wait, manchmal beim post passiert, aber bisher immer wenn S1 auf 16 (vor dem wait) und S2 auf 240 ist

Dann kann es nicht am gezeigten Programmteil liegen. Die post-Operation (Deinem Quellcode nach ist das bei dir die, die ihn frei gibt.) eines Semaphors blockiert per Definition *nie*.

Entweder spielen da andere Teile deines Programms irgendwie mit rein oder die Semaphor-Implementierung ist kaputt.

Hallo,

dann habe ich 2 Methoden:
push(content) {
sem_wait(S1);
// füge content in pipe
sem_post(S2);
}

Wieso gibts du denn eine andere Semaphore frei, als du gelockt hast?

Irgendwie erschliesst sich mir die Logik deines Programms nicht.

Gruesse,
Moritz

Das ist eine Standardlösung für das Erzeuger-Verbraucher-Problem (https://secure.wikimedia.org/wikipedia/de/wiki/Erzeu…):

Der eine Semaphor zählt die belegten Pufferelemente, der andere die freien. Durch die überkreuzte Nutzung regeln die beiden Semaphore automatisch die beiden möglichen Wartesituationen - Erzeuger findet kein freies Element zum Beschreiben, Verbraucher findet kein belegtes zum Verarbeiten. Sie blockieren dann jeweils an einem Semaphor.

Howdy,

Das ist eine Standardlösung für das
Erzeuger-Verbraucher-Problem
(https://secure.wikimedia.org/wikipedia/de/wiki/Erzeu…):

yep, aber die Ops auf der pipe muessen trotzdem noch mit einer zusaetzlichen Mutex geschuetzt werden.

Und sofern das ganze unter *nix stattfindet, muss man noch explizit -lpthread dazu binden (oder -mt), denn ansonsten wird bei dem einen oder anderen OS eine „Dummy“ pthread Library dazugebunden, die de-facto gar nicht das gewuenschte macht.

Wenn das auch nicht hilft, dann koennte es helfen, hier mal den gesamten fraglichen Code zu posten …

Gruss
norsemanna

ich wusste garnicht, dass das Kind nen Namen hat ^^

also danke für den Denkanstoß, ist natürlich klar, dass post nicht blockiert.

Ich habe jetzt meine Ausgaben mal etwas abgeändert und bemerkt, dass die Blockade nicht in den Semaphoren-Operationen geschieht, sondern während der Ausgabe (printf)
Lustigerweise funktioniert es, seit ich einen char*, den ich mit ausgebe, als const deklariert habe.

Damit wäre dieses Problem auf recht seltsame Weise gelöst.