At 05:43 PM 8/1/2002 +0800, Alan Knowles wrote:
>>It's not about looking at the perl code, that will tell you nothing
>>unless you know perl internals. It's about the way the interpreter
>>works, some of the architecture, that is simular to PHP. In PHP, threads
>>are isolated, kind of like seperate processes, but in threads.
>
>
> From my understanding they are 'forced to be isolated' by the TSRM
> stuff. which looks like it stores globals in something like an
> associated array ( thread id => global c variable - eg. compiler_globals
> etc.), when ZTS is enabled..
>
>>Everything in PHP works that way, so in creating threads for php scripts,
>>you have to have a seperate interpreter. Then you have to create a
>>"bridge" between the threads for shared variables. shmop comes close to
>>what is needed, but not close enough.
>
>the real use of the threading I guess is for people who want to write tcp
>servers, or desktop gtk apps.
>
>Thoughts on accessing 'threaded shared vars'
>------------------------------------------------------------
>$_THREADVAR['gtktext'] type..
>
>php_threads_malloc_lock();
>$_THREADVAR['gtktext']->add_text('some data ouput');
>php_threads_malloc_unlock();
>
>this would I guess involve rather heavy changes to the ZE engine to
>recogize an lock/unlock, copy (rather than refcount) etc. variables that
>where threaded..
>
>
>Threaded objects???
>I guess the other consideration is to have thread variable objects..
>$threadvar = new Thread_Var();
>$threadvar->setNewObject('mywidget','GtkWindow');
>$threadvar->set('mywidget',$gtkobject);
>$var = $threadvar->get('mywidget');
>$var = $threadvar->getArray('key','val');
>$threadvar->callMethod('mywidget', 'add_text','something');
>
>obviously copying and accessing these would probably be easier to cope
>with ( without having to modify heavily the zend engine) - we could do
>'real' copying on the data, rather than refcounting them. and reduce the
>headaches...
>
>>You're much closer to what needs to happen now. But you cannot simply
>>point to the memory for another thread. Doing that will cause problems
>>like you are running into. You actually have to copy a bunch of stuff so
>>each thread is completely independent.
>
>Do you mean we will have to really physically copy the all theopcode data
>from one thread to another?
>
>>
>>
>>I've worked up some code in TSRM to abstract native thread calls, and
>>have started on an extension, but probably won't have it complete until
>>this weekend some time. What you've done now is fairly simular, but
>>pthread specific. Given time, I might have enough done to email a diff
>>containing my work tomorrow night if you want to take a look.
>
>Anything I can do to help - testing, understanding - let me know.
>Sounds Great.
First of all I agree that the two threads shouldn't really share the same
engine instance. It would mean that everything would have to be mutexed.
The solution of creating a separate interpreter instance and having a
couple of methods to share data in between them (like shared memory) is the
way to go.
As creating a copy of a currently executing instance is very hard to do in
my opinion I suggest an API such as:
create_thread("thread.php");
This would create a new instance of the interpreter which would compile
thread.php and start running it. So the actual function/class tables of the
thread could be different from the parent who created it which I think is fine.
Andi
--
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php