php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 13.10.2010, 15:35  
Neuer Benutzer
 
Registriert seit: 11.02.2010
Beiträge: 13
PHP-Kenntnisse:
Anfänger
nobnt befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] sem_release behauptet, es das Semaphore wäre "not currently acquired"

Hallo zusammen,

gerade habe ich ein Problem mit Semaphoren. Die Suche hier im Forum hat mir leider nichts gebracht, deshalb hoffe ich, dass mein Problem so simpel ist, dass ich die Lösung einfach nur nicht sehe, weil ich mich Gedanklich verrannt habe.

Die Ausgangssituation:
Es gibt ein Semaphore welches ich mit:
PHP-Code:
$semId sem_get1510666); // Die null ist wichtig, damit das Semaphore nicht am Scriptende gelöscht wird.
sem_acquire$semId );
sem_release($semId); 
aufrufe.

Soweit klappt das ganz gut. Damit kann ich auch verschiedene gleichzeitig laufende Scripte in kritischen Bereichen trennen.

Nun habe ich hier gerade aber ein Produzenten-Konsumenten-Problem:
Die beiden Scripte sind:
PHP-Code:
/...
// konsumierender Teil:
$semId sem_get1510666);
sem_acquire$semId );
while ( 
true )
{
    
sem_acquire$semId );
    
// es folgt eine schnelle Abarbeitung.
}
/... 
PHP-Code:
/...
// produzierender Teil:
$semId sem_get1510666);
while ( 
true )
{
    
// es folgt eine langsame Abarbeitung. z.B. sleep(1) ;)
    
sem_release$semId );
}
/... 
Da der Konsument vor dem Produzent startet, kann ich sicher sein, dass das Semaphore existiert und "acquired" ist.

Aber: Das Produzierende Script behauptet, dass Semaphore wäre nicht "acquired"
Zitat:
Warning: sem_release() [function.sem-release]: SysV semaphore 2 (key 0xf) is not currently acquired in /*/*/*/test2.php on line XX
Das Semaphoren eigentlich nicht für diesen Einsatzzweck entwickelt wurden ist mir klar. Aber ich bin mir auch sicher, dass diese Technik funktioniert. Ich habe noch mal in anderen Programmen nachgeschaut und da läuft so was definitiv (C++ mit Qt's QSemaphore).

Nun ist also meine Frage, an welcher Stelle der Fehler zu finden ist. Oder ist das schlicht und ergreifend nur ein Bug? Dann würde ich das auch gerne bestätigt haben.

Vielleicht gibt es aber auch eine andere schöne Lösung und ich bin total borniert - das würde ich dann gerne ändern. Wie löst Ihr solche Probleme?

Vielen Dank im Voraus für alle Antworten.
nobnt

Geändert von nobnt (13.10.2010 um 15:35 Uhr). Grund: Danke sagen vergessen.
nobnt ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 13.10.2010, 16:03  
Moderator
 
Benutzerbild von Asipak
 
Registriert seit: 18.07.2005
Beiträge: 4.072
Asipak sorgt für eine eindrucksvolle AtmosphäreAsipak sorgt für eine eindrucksvolle Atmosphäre
Standard

Ich habe noch nicht mit Semaphoren gearbeitet, doch http://de3.php.net/sem_get sagt mir, dass du beim zweiten Aufruf der Funktion eine andere Resource ID zurückbekommst, als beim ersten Mal.

Vielleicht liegt da der Hund begraben.
Asipak ist offline   Mit Zitat antworten
Alt 13.10.2010, 16:14  
Neuer Benutzer
 
Registriert seit: 11.02.2010
Beiträge: 13
PHP-Kenntnisse:
Anfänger
nobnt befindet sich auf einem aufstrebenden Ast
Standard

ja, das ist richtig, aber die unterschiedlichen IDs "greifen ... auf den gleichen darunterliegenden Semaphor zu." (Quelle)

Und dieses Verhalten wird von meinen Versuchen bestätigt: Wenn ich also ein Semaphore sperre, kann ein anderes Script dieses nicht erneut sperren (Bzw. wartet an dieser Stelle, bis es wieder frei geworden ist). Es ist mir nur nicht möglich, dieses Semaphore von einem anderen Script aus zu entsperren. (Löschen geht übrigens auch, aber das verursacht verständlicherweise noch viel mehr Fehler)

Geändert von nobnt (13.10.2010 um 16:15 Uhr). Grund: logikfehler durch Satzbau beseitigt
nobnt ist offline   Mit Zitat antworten
Alt 13.10.2010, 16:15  
Erfahrener Benutzer
 
Benutzerbild von lstegelitz
 
Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse:
Fortgeschritten
lstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nett
Standard

Bin da auch kein Fachmann, aber Script 2 ruft kein sem_acquire() auf, daher wird wohl sem_release() nichts zum Freigeben haben...
sem_release() releases the semaphore if it is currently acquired by the calling process.

So wie ich das verstehe, wird pro Script eine Semaphore angelegt (sem_get()), dann wird versucht, diese zu belegen (sem_acquire()). Sollte das nicht klappen, weil die Semaphore bereits belegt ist, blockt der Aufruf solange, bis die Semaphore frei wird. Ansonsten wird das Script weiter abgearbeitet, bis die Semaphore am Ende wieder freigegeben wird.

PHP-Code:
$sem sem_get(...);
sem_acquire($sem); // sig. semaphore. will block if semaphore is currently acquired
// do some work
sem_release($sem); // release semphore, so other threads can access it 
__________________
Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.
lstegelitz ist offline   Mit Zitat antworten
Alt 13.10.2010, 16:25  
Neuer Benutzer
 
Registriert seit: 11.02.2010
Beiträge: 13
PHP-Kenntnisse:
Anfänger
nobnt befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von lstegelitz Beitrag anzeigen
sem_release() releases the semaphore if it is currently acquired by the calling process.
Hmmm, das würde erklären warum es nicht geht.

Mir ist gerade aufgefallen, dass uns das Handbuch auf der deutschen und auf der englischen Seite zwei verschiedene $perm Werte als Standard unterjubeln möchte. Vielleicht ist das ein Ansatzpunkt an dem ich noch mal genauer nachschauen sollte.

Aber wenn jemand noch einen Hinweis hat, nur her damit.
nobnt ist offline   Mit Zitat antworten
Alt 13.10.2010, 16:40  
Erfahrener Benutzer
 
Benutzerbild von lstegelitz
 
Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse:
Fortgeschritten
lstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nett
Standard

Ist eigentlich auch völlig logisch, denn könntest du eine Semaphore von einem anderen Script aus freigeben, wäre der ganze Sinn der Semaphoren über den Haufen geworfen - jedes Script könnte eine Semaphore, falls gesperrt, freigeben und für sich selber belegen (und damit Zugriff auf die kritische Resource bekommen, die eigentlich durch die Semaphore geschützt werden sollte). Faktisch würde die Semaphore ignoriert werden.
__________________
Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.
lstegelitz ist offline   Mit Zitat antworten
Alt 14.10.2010, 16:09  
Neuer Benutzer
 
Registriert seit: 11.02.2010
Beiträge: 13
PHP-Kenntnisse:
Anfänger
nobnt befindet sich auf einem aufstrebenden Ast
Standard

Hallo,

endlich hab ich dieses schäbbige Problem gelöst. Semaphore sind in der Tat nicht für diese Aufgabenstellung gedacht.

Es gibt es aber Signale. Damit funktioniert es, wir ich es mir gewünscht habe. Da dieses Thema hier im Forum nicht so verbreitet ist, wollte ich noch mal ein kleines Beispiel posten.

Es grüßt
der nobnt
PHP-Code:
<?php

$vaterId 
posix_getpid();
$kindId pcntl_fork();

if (
$kindId)
{
    
pcntl_signalSIGUSR1, function(){});
    for ( 
$i 0$i 3$i++ )
    {
        
pcntl_sigwaitinfo(array(SIGUSR1));
        echo 
"B\n";
    }
}
else
{
    
$kindId posix_getpid();
    for ( 
$i 0$i 3$i++ )
    {
        
sleep(1);
        echo 
"A...";
        
posix_kill$vaterIdSIGUSR1 );
    }
}

?>
nobnt ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
sysv semaphore is not currently acquired, kenntnisse der semaphore, php5 wie bekomme ich zugriff auf posix_getpid(), php semaphor, php semaphores, php sem_release, semaphor php, sem_release(): sysv semaphore not acquired, \das semaphore\, sem_get php, sem_release, semaphore freigeben aus anderem bereich, sem_release \is not currently acquired in\

Alle Zeitangaben in WEZ +2. Es ist jetzt 22:36 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum