No. Isolates are completely isolated "instances" of V8, including separate
heaps.
Generally, by design Javascript lacks facilities for shared-memory
multithreaded programming.

Kind regards,
Dmitry


On Mon, Apr 8, 2013 at 2:55 PM, Laszlo Szakony <laszlo.szak...@certec.at>wrote:

> OK. I will use isolates. Can I share the global object between isolates?
>
> Am Montag, 8. April 2013 11:14:57 UTC+2 schrieb Jakob Kummerow:
>>
>> I didn't realize that you had several threads running at the same time in
>> the same isolate. V8 is not designed for this, and you could hit all sorts
>> of "interesting" behavior. You should use a separate isolate for each
>> thread.
>>
>>
>> On Mon, Apr 8, 2013 at 10:59 AM, Laszlo Szakony <laszlo....@certec.at>wrote:
>>
>>> Hi Jakob,
>>>
>>> thank you for the detailed explanation.
>>> You are right. The execution was terminated after a long time with
>>> sleep(500), and with sleep(1) the execution terminated in a few seconds.
>>> Though my formulation of title of theme was not correct, your answer
>>> helped me to analyse the real problem.
>>> I don´t want to terminate the thread(s) running the isolate. I just want
>>> to terminate the execution the currently running JS function in the isolate.
>>> Using sleep() was just a tool setup a reproducible test environment. The
>>> tests in my system were setup as follows:
>>> - Start 20 isolates running the JS function "function f() {
>>> while(true){sleep(10);} } f();"
>>> - Call v8::TerminateExecution(thread_**id) for the 20 isolates running
>>> the same JS code.
>>> - PROBLEM: All but one isolate terminated the execution of JS code in a
>>> few seconds.
>>> - The remaining isolate continued running the JS code, even calling
>>> v8::TerminateExecution(thread_**id) several times.
>>>
>>> So I modified in 'cctest' the file 'test-thread-termination.cc' to
>>> reproduce the behavior, but without success. It worked fine.
>>> But I observed, that terminating the first isolate happens mach faster,
>>> then terminating the remaining ones.
>>> The test is as follows:
>>> - Start 3 isolates running the JS funciton "function f() { sleep(1000);
>>> while(true){sleep(1);} } f();"
>>> - Call v8::TerminateExecution(thread_**id) for the 3 isolates running
>>> the same JS code.
>>> - I stored the looping count in the while loop, and printed at the end.
>>> Here are the results:
>>>
>>> Seconds      Message
>>> ==============================**======================
>>> 00.000  Started Thread : 2
>>> 00.007  Thread 2 sleeping for 1000 millisec
>>> 00.007  Started Thread : 3
>>> 00.008  Thread 3 sleeping for 1000 millisec
>>> 00.009  Started Thread : 4
>>> 00.017  Thread 4 sleeping for 1000 millisec
>>> 00.018  Terminating Thread 2
>>> 00.019  Terminating Thread 3
>>> 00.021  Terminating Thread 4
>>> 01.007  Thread 2 sleeping over for 1000 millisec
>>> 01.009  Thread 3 sleeping over for 1000 millisec
>>> 01.018  Thread 4 sleeping over for 1000 millisec
>>> 01.133  Finished Thread : 2 with loop count : 0
>>> 04.110  Finished Thread : 4 with loop count : 2939
>>> 04.111  Finished Thread : 3 with loop count : 2951
>>> 04.113  Sum of loop counts : 5890
>>>
>>> I repeated the test with different number of isolates, the result was
>>> always the same:
>>>
>>> 00.000  Started Thread : 2
>>> 00.012  Thread 2 sleeping for 1000 millisec
>>> 00.013  Started Thread : 3
>>> 00.018  Thread 3 sleeping for 1000 millisec
>>> 00.018  Started Thread : 4
>>> 00.020  Thread 4 sleeping for 1000 millisec
>>> 00.020  Started Thread : 5
>>> 00.032  Started Thread : 6
>>> 00.034  Thread 6 sleeping for 1000 millisec
>>> 00.044  Thread 5 sleeping for 1000 millisec
>>> 00.045  Terminating Thread 2
>>> 00.046  Terminating Thread 5
>>> 00.047  Terminating Thread 3
>>> 00.048  Terminating Thread 6
>>> 00.048  Terminating Thread 4
>>> 01.012  Thread 2 sleeping over for 1000 millisec
>>> 01.018  Thread 3 sleeping over for 1000 millisec
>>> 01.020  Thread 4 sleeping over for 1000 millisec
>>> 01.044  Thread 6 sleeping over for 1000 millisec
>>> 01.045  Thread 5 sleeping over for 1000 millisec
>>> 01.065  Finished Thread : 2 with loop count : 0
>>> 02.568  Finished Thread : 3 with loop count : 1475
>>> 02.570  Finished Thread : 6 with loop count : 1471
>>> 02.572  Finished Thread : 5 with loop count : 1471
>>> 02.577  Finished Thread : 4 with loop count : 1475
>>> 02.580  Sum of loop counts : 5892
>>>
>>> Interesting is, that the sum of the loop counts seems to be constant.
>>> Would it mean that running 20 isolates terminates faster that running 2
>>> or 3?
>>>
>>> I suspect, that in my application the remaining isolate that does not
>>> terminate the execution of the running JS code is the "first" isolate.
>>>
>>> Do you have any idea, what conditions could cause to prevent
>>> the termination of execution of JS Code?
>>> Timing constraints, debugging ports, common global object, ...?
>>>
>>> Thank you,
>>>
>>> Laszlo
>>>
>>> On Thursday, 4 April 2013 15:45:25 UTC+2, Jakob Kummerow wrote:
>>>
>>>> TerminateExecution() does not send a kill signal to the process/thread
>>>> or anything like that. It sets a flag that requests termination of
>>>> currently running generated code for JS functions. Execution in loops isn't
>>>> necessarily terminated immediately, several iterations of the loop may
>>>> still happen (this depends on the length of the loop). The idea is that you
>>>> can quickly gain control over long-running scripts ("Your browser tab is
>>>> hanging, would you like to stop it?"). V8 does not have, and in my opinion
>>>> does not need, a mechanism to interrupt v8::internal::OS::Sleep(), as this
>>>> is never called from JS (in vanilla V8).
>>>>
>>>> The reason your alternative "DoSleep" implementation terminates much
>>>> quicker is because the C++ function finishes much sooner, returning control
>>>> to JS, which in turn is interrupted after a couple of loop iterations. I'm
>>>> willing to bet that if you reduce the sleeping interval from 500ms to, say,
>>>> 1ms in the other implementation, you'll observe much quicker termination
>>>> there (and, conversely, if you wait long enough, the 500ms version will
>>>> terminate eventually).
>>>>
>>>> Long story short: v8::TerminateExecution() is not designed to interrupt
>>>> v8::internal::OS::Sleep(), nor any other function or FunctionTemplate
>>>> implemented in C++. If you want to be able to have sleeping threads and
>>>> terminate them, you'll have to use either another sleep implementation, or
>>>> another way to request termination. (Where "use another" means "implement
>>>> your own".)
>>>>
>>>>
>>>> On Thu, Apr 4, 2013 at 10:16 AM, Laszlo Szakony 
>>>> <laszlo....@certec.at>wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> I'm using v8 - v8_13185_v3.15.11 - on Windows, Win7 64bit in
>>>>> multi-threaded environment: several scripts are running parallel.
>>>>> At an arbitrary time I want to terminate certain running scripts or
>>>>> maybe all from another thread. Some of the scripts may have infinite 
>>>>> loops.
>>>>> Everything works fine, until some scripts call dosleep() in a
>>>>> FunctionTemplate defined as follows:
>>>>>
>>>>> (In thread script[n])
>>>>>
>>>>> v8::Handle<v8::Value> DoSleep(const v8::Arguments& args) {****
>>>>>
>>>>>   int millisec = args[0]->ToInt32()->**Int32Value**();****
>>>>>
>>>>>   if (millisec)****
>>>>>
>>>>>   {****
>>>>>
>>>>>     v8::Unlocker unlock;****
>>>>>
>>>>>     v8::internal::OS::Sleep(**millis**ec);****
>>>>>
>>>>>   }****
>>>>>
>>>>>   return v8::Undefined();****
>>>>>
>>>>> }****
>>>>>
>>>>> …****
>>>>>
>>>>> v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New();****
>>>>>
>>>>> global->Set(v8::String::New("**d**osleep"), v8::FunctionTemplate::New(
>>>>> **DoSl**eep));****
>>>>>
>>>>> …****
>>>>>
>>>>> The JavaScript Code looks sg. like this:****
>>>>>
>>>>> v8::Script::Compile(v8::**String**::New("function f() { while(true)
>>>>> {dosleep(500);} } f()"))->Run();****
>>>>>
>>>>> ** **
>>>>>
>>>>> In the main thread I call:****
>>>>>
>>>>> v8::Locker locker;****
>>>>>
>>>>> for (int i = 0; i < kThreads; i++) {****
>>>>>
>>>>>   v8::V8::TerminateExecution(**thr**eads[i]->GetV8ThreadId());****
>>>>>
>>>>> ** **
>>>>>
>>>>> The threads calling dosleep() won`t terminate. If I change the
>>>>> DoSleep() Function() to:****
>>>>>
>>>>> v8::Handle<v8::Value> DoSleep(const v8::Arguments& args) {****
>>>>>
>>>>>   int millisec = args[0]->ToInt32()->**Int32Value**();****
>>>>>
>>>>>   if (millisec)****
>>>>>
>>>>>   {****
>>>>>
>>>>>     v8::Unlocker unlock;****
>>>>>
>>>>>     for (int i = count; i--;) for (int j = 1000; j--;) ;****
>>>>>
>>>>>   }****
>>>>>
>>>>>   return v8::Undefined();****
>>>>>
>>>>> }
>>>>>
>>>>>
>>>>> then the threads calling dosleep() will be terminated.****
>>>>>
>>>>> I have modified test-thread-termination.cc to demonstrate the
>>>>> behavior. After replacing test-thread-termination.cc with the attached one
>>>>> and compiling of ccttest the tests can be called by:****
>>>>>
>>>>> C:\v8_13185_v3.15.11\build\**Rel**ease>cctest test-thread-termination/
>>>>> **Termin**ateMultipleV8ThreadsWith**DelayD**efaultIsolate => OK****
>>>>>
>>>>> C:\v8_13185_v3.15.11\build\**Rel**ease>cctest test-thread-termination/
>>>>> **Termin**ateMultipleV8ThreadsWith**SleepD**efaultIsolate => Failed:
>>>>> no termination****
>>>>>
>>>>>
>>>>> Is this a bug? If not, how can I terminate scripts calling sleep()?
>>>>>
>>>>>
>>>>> Thank you,
>>>>>
>>>>> Laszlo
>>>>>
>>>>> --
>>>>> --
>>>>> v8-users mailing list
>>>>> v8-u...@googlegroups.com
>>>>>
>>>>> http://groups.google.com/**group**/v8-users<http://groups.google.com/group/v8-users>
>>>>> ---
>>>>> You received this message because you are subscribed to the Google
>>>>> Groups "v8-users" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>>> an email to v8-users+u...@**googlegroups.com**.
>>>>>
>>>>> For more options, visit 
>>>>> https://groups.google.com/**grou**ps/opt_out<https://groups.google.com/groups/opt_out>
>>>>> .
>>>>>
>>>>>
>>>>>
>>>>
>>>>  --
>>> --
>>> v8-users mailing list
>>> v8-u...@googlegroups.com
>>> http://groups.google.com/**group/v8-users<http://groups.google.com/group/v8-users>
>>> ---
>>> You received this message because you are subscribed to the Google
>>> Groups "v8-users" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to v8-users+u...@**googlegroups.com.
>>> For more options, visit 
>>> https://groups.google.com/**groups/opt_out<https://groups.google.com/groups/opt_out>
>>> .
>>>
>>>
>>>
>>
>>  --
> --
> v8-users mailing list
> v8-users@googlegroups.com
> http://groups.google.com/group/v8-users
> ---
> You received this message because you are subscribed to the Google Groups
> "v8-users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to v8-users+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/groups/opt_out.
>
>
>

-- 
-- 
v8-users mailing list
v8-users@googlegroups.com
http://groups.google.com/group/v8-users
--- 
You received this message because you are subscribed to the Google Groups 
"v8-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to v8-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to