山本です。

>> そうしますと,ruby スレッドでない pthread で
>> ruby のシグナルハンドラがシグナルを受け取った場合、
>> その pthread でこれ以上シグナルを受け取らないように 
>> pthread_sigmask で設定して pthread_kill で ruby 
>> スレッドに送り直すようにしなければならないのでしょうか?

どうも Windows ではその必要はないようです。というのも、
過去ログを調べたところ、[ruby-dev:10725][ruby-dev:10832] で
同じような問題が(SIGINT が別スレッドから送られて SEGV)あったようなのですが、
signal.c (sighandler) の IN_MAIN_CONTEXT の部分で対処済みでした。

# pthread_kill の代替が不可能なために別の方法が用意されたようです。

幸い HAVE_NATIVETHREAD なのは Windows と pthread だけのようなので、
当面は下のような感じで対処すれば十分なのではないかと思います。

# 下のパッチはあくまで「感じ」です。相当手抜いてます。

Index: eval.c
===================================================================
RCS file: /src/ruby/eval.c,v
retrieving revision 1.755
diff -u -w -b -p -r1.755 eval.c
--- eval.c	22 Feb 2005 14:57:43 -0000	1.755
+++ eval.c	23 Feb 2005 09:04:01 -0000
@@ -1241,6 +1241,10 @@ int
 is_ruby_native_thread() {
     return NATIVETHREAD_EQUAL(ruby_thid, NATIVETHREAD_CURRENT());
 }
+rb_nativethread_t
+ruby_native_thread() {
+    return ruby_thid;
+}
 #endif
 
 NORETURN(static void rb_thread_start_1 _((void)));

Index: ruby.h
===================================================================
RCS file: /src/ruby/ruby.h,v
retrieving revision 1.109
diff -u -w -b -p -r1.109 ruby.h
--- ruby.h	17 Nov 2004 02:27:36 -0000	1.109
+++ ruby.h	23 Feb 2005 09:20:09 -0000
@@ -702,6 +702,7 @@ typedef DWORD rb_nativethread_t;
 #endif
 #ifdef HAVE_NATIVETHREAD
 RUBY_EXTERN int is_ruby_native_thread();
+RUBY_EXTERN rb_nativethread_t ruby_native_thread();
 #else
 #define is_ruby_native_thread() (1)
 #endif

Index: signal.c
===================================================================
RCS file: /src/ruby/signal.c,v
retrieving revision 1.55
diff -u -w -b -p -r1.55 signal.c
--- signal.c	30 Nov 2004 17:28:16 -0000	1.55
+++ signal.c	23 Feb 2005 08:59:36 -0000
@@ -417,6 +417,12 @@ sighandler(sig)
     ruby_signal(sig, sighandler);
 #endif
 
+#if defined(HAVE_NATIVETHREAD) && defined(HAVE_LIBPTHREAD)
+    if (!is_ruby_native_thread()) {
+	pthread_kill(ruby_native_thread(), sig);
+    }
+#endif
+
     if (trap_list[sig].cmd == 0 && ATOMIC_TEST(rb_trap_immediate)) {
 	IN_MAIN_CONTEXT(signal_exec, sig);
 	ATOMIC_SET(rb_trap_immediate, 1);