Version française
Home     About     Download     Resources     Contact us    
Browse thread
[Caml-list] Inter-thread exceptions
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Dmitry Bely <dbely@m...>
Subject: Re: [Caml-list] Inter-thread exceptions
Xavier Leroy <xavier.leroy@inria.fr> writes:

>> How big a task would it be to implement asynchronous inter-thread
>> exceptions? In practice the feature would amount to a function:
>> 
>> val raise_to : exn -> Thread.t -> unit
>> 
>> This would be most handy for implementing eg. timeouts: just make a thread
>> that sleeps and raises an exception in the other thread when the time is
>> spent.
>
> Yes, this is a reasonable model for thread cancellation -- a lot better
> than Thread.kill, because the "victim" thread can catch the exception
> and perform cleanup actions like releasing mutexes.  
>
> It's not hard to implement with bytecode-level threads (where Caml
> does the scheduling), but there is a major difficulty with system
> threads: if the target thread is blocked on a system call such as
> network I/O, it is extremely difficult to terminate the system call
> prematurely and have the target thread honor the exception immediately.

Nethertheless I think it's possible for network I/O, and even portable
enough (should work under pthreads/windows threads). Roughly the idea is
following:

0. Create a global "interrupt" socket.
1. Perform select() before  each blocking syscall, waiting for readability
of "interrupt" socket or the necessary state of "main" socket.
3. If "main" socket was in the necessary state, do the syscall.
4. If "interrupt" socket is readable, determine interrupt to which thread
is requested. If it's other thread, call sched_yield() for pthreads
(nothing under Windows) and return to (1)

Interrupt is performed by sending some predefined data to "interrupt"
socket.

Of course this assumes some overhead, but hopefully not that much. 

- Dmitry Bely


-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners