21 messages in org.ruby-lang.ruby-talkRe: C Threads and Ruby
FromSent OnAttachments
Kroeger, Simon (ext)Jun 20, 2006 3:27 am 
Patrick HurleyJun 20, 2006 4:28 am 
Kroeger, Simon (ext)Jun 20, 2006 4:59 am 
Francis CianfroccaJun 20, 2006 5:13 am 
Patrick HurleyJun 20, 2006 9:39 am 
Paul BrannanJun 20, 2006 11:33 am 
Patrick HurleyJun 20, 2006 1:16 pm 
Francis CianfroccaJun 20, 2006 1:17 pm 
Francis CianfroccaJun 20, 2006 1:19 pm 
Simon KrögerJun 20, 2006 2:29 pm 
Joel VanderWerfJun 20, 2006 2:35 pm 
Francis CianfroccaJun 20, 2006 2:39 pm 
Bill KellyJun 20, 2006 2:42 pm 
Simon KrögerJun 20, 2006 2:49 pm 
Francis CianfroccaJun 20, 2006 3:26 pm 
Francis CianfroccaJun 20, 2006 3:34 pm 
Bill KellyJun 20, 2006 4:08 pm 
Francis CianfroccaJun 20, 2006 5:07 pm 
Kroeger, Simon (ext)Jun 21, 2006 2:53 am 
Francis CianfroccaJun 21, 2006 3:15 am 
Paul BrannanJun 22, 2006 8:21 am 
Actions with this message:
Paste this link in email or IM:
Paste this link in email or IM:
Atom feed for this thread
Paste this URL into your reader:
Subject:Re: C Threads and RubyActions...
From:Patrick Hurley (phur@gmail.com)
Date:Jun 20, 2006 9:39:30 am
List:org.ruby-lang.ruby-talk

On 6/20/06, Francis Cianfrocca <garb@gmail.com> wrote:

Patrick: given your proposal for an event queue filled by native threads in C and consumed by a Ruby thread, notice that there is no mutex that works between native threads and Ruby threads. Your example of "signalling" by changing the value of an integer probably works because on an Intel chip (you said you did this on Windows), it only takes one memory-bus cycle to change the value of a 32-bit integer, so you can get away without a mutex. I doubt this would work with a more complex data structure.

That is not true, it is completely possible to use an OS level mutex/critical section etc, from inside a "green" Ruby thread. It will block all Ruby threads which is not very nice, but I do not know of a better solution.

I used a system mutex (actually a CriticalSection) in both threads -- yes it blocks ruby, but only long enough to read the memory. It would be better if the Ruby C API provide a thread safe wait for non-native threads -- but this does work and is completely thread safe even if I were not doing an atomic operation (for example working off a linked list).

pth