>>>>> "E" == Emil Ong <onge / mcs.anl.gov> writes:

E> How do you pass a function as a block to create a new thread in C?

 rb_thread_create(VALUE (*fn)(), void *arg);

E> Are C functions considered atomic? 

 When your C function run, the ruby scheduler don't run (except if you make
 explicit call to it or you call some ruby functions which can possiblycall
 the scheduler).

 You must call CHECK_INTS if you don't want to block ruby

E> Will passing in a C function have any effect?

 Stopping all other threads.

E> And a more general Ruby thread question: How often can I expect Ruby to
E> switch threads? 

 Difficult to reply : ruby install a timer (on VTALRM)

pigeon% ruby -e 'trap("VTALRM") {}'
-e:1:in `trap': SIGVTALRM reserved for Thread; cannot set handler (ArgumentError)
        from -e:1
pigeon% 

 Each time the timer expire and if ruby is not in critical phase
 (rb_thread_critical) , the thread is immediately re-scheduled if
 rb_trap_immediate is set, otherwise ruby set the global variable
 rb_thread_pending. 

 When CHECK_INTS is called, if ruby can be interrupted (see DEFER_INTS,
 ALLOW_INTS, ENABLE_INTS in rubysig.h)
   * it first check if some interrupt are pending (rb_trap_pending)
   * then it check if it must try to re-schedule the thread
 (rb_thread_pending is true and ruby is not in a critical phase
 (Thread::critical=) 

 It's best to look at rubysig.h


Guy Decoux