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

Reply via email to