I would like to synchronize between various PHP pages as well as some C++ 
applications. I thought I could use the SYS V semaphores in PHP along with 
the C semaphore library to do this. I wrap this semaphore into a Mutex 
class (one for PHP and one for C++) and use the semaphore strictly for 
mutual exclusive access. It appears that the way PHP manipulates semaphores 
is comepltly backwards with respect to the C library...

There appears to be some issues, namely:
1) when the semaphore is created by PHP (using sem_get) it will create a 
semaphore set with 3 semaphores in it. When created with C code I can 
choose how many items are in the set (why not use 1 item).

2) In PHP it initializes the 3 items in the semaphore set all with a 0 
value. In C each item is initialized with a 0 value but the library allows 
me to set them to 1 to use the semaphore for locking (in a thread-safe 
manner). 

The problems:
1) why does PHP need to a semaphore set with 3 items?

2) In C++ I initialize the sempahore items to the value 1. This means the 
resource is available. When someone acquires the resource this "value" is 
decremented. When it reaches zero the count is 0 and the semaphores is 
unavailable. When the C code releases the semaphore, it increments this 
value and ther semaphore becomes available.

In C the function call you can make to acquire the semaphore resource is 
"semctl" specifiying "-1" as the command. This will block until the value 
is greater than 0 (and it is initially greater than 0 when no other 
process/thread has acquired the semaphore).

NOTE: I am NOT having 1 process increment the semaphore and 1 process 
decrement it (as explained in the PHP documentation, the semaphore module 
cannot do this). I am using it stricly for mutual exclusion. If a process 
acquires the semaphore (decrements the count from 1 to 0) it must release 
(increment the count from 0 to 1).

THE BIG PROBLEM is that PHP uses the oppostie semantics as the C library. 
In PHP, when one acquires the sempahore it increases the value count (from 
0 to 1) - it starts out at 0 in PHP. When PHP releases it decrements the 
value from 1 to 0. It seems to only do this to the 3rd semaphore item in 
the semaphore set.

I feel that the implementation of semaphores in PHP has 2 major issues:
1) it should not have to create 3 semaphores in the set
2) it should use the C type sematics of decrementing the count to acquire 
the reosurce and incrementing to release it.

OTHERWISE the current behaviour of the semaphore module means that we 
cannot share the same semaphore between PHP and C.

Question: why did PHP implement it this way?
Will someone fix it so that it is compatable with the rest of the world 
(aka all C programs running on the same machine)?
Or perhaps I am missing something here.

-- 
Mike Papper

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to