é è—¤ã§ã™ã€‚
1.9 ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã«ãƒ‡ãƒƒãƒ‰ãƒãƒƒã‚¯æ¤œå‡ºã‚’実装ã—ã¦ã¿ã¾ã—ãŸã€‚
$ ./ruby -e ‘Thread.new { Thread.stop }; Thread.stop’
-e:1:in stop': deadlock detected (fatal) from -e:1:in
’
ã¡ã‚‡ã£ã¨ã§ã‹ã„パッム(添付) ã§ã™ãŒã€è¦æ—¨ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™ã€‚
-
スレッドã®çŠ¶æ…‹ç¨®åˆ¥ã« THREAD_STOPPED_FOREVER ã‚’è¿½åŠ ã€‚
無期é™ã® sleep 状態㨠mutex 解放待ã¡çŠ¶æ…‹ã‚’表ã™ã€‚ -
rb_vm_t ã«å¤‰æ•° sleeper ã‚’è¿½åŠ ã€‚
THREAD_STOPPED_FOREVER 状態ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã®æ•°ã‚’表ã™ã€‚ -
rb_thread_t ã«å¤‰æ•° locking_mutex ã‚’è¿½åŠ ã€‚
ã“ã®ã‚¹ãƒ¬ãƒƒãƒ‰ãŒå¾…ã£ã¦ã„ã‚‹ mutex を表ã™ã€‚ -
rb_thread_t ã«å¤‰æ•° keeping_mutexes ã‚’è¿½åŠ ã€‚mutex_t ã«
変数 next_mutex ã‚’è¿½åŠ ã€‚
スレッドãŒãƒãƒƒã‚¯ã—ã¦ã„ã‚‹ mutex ã®ãƒªã‚¹ãƒˆã‚’表ã™ã€‚ -
mutex_t ã«å¤‰æ•° cond_notified ã‚’è¿½åŠ ã€‚
cond_signal ã•ã‚Œã¦ã¾ã èµ·å‹•ã—ã¦ã„ãªã„スレッドã®æ•°ã‚’表ã™ã€‚ -
rb_mutex_lock ã‚„ rb_mutex_unlock ã§ä¸Šè¨˜ã®å¤‰æ•°ãŸã¡ã‚’
é©å®œæ›´æ–°ã™ã‚‹ã‚ˆã†ã«ã—ãŸã€‚ -
唯一動ã„ã¦ã„ãã†ãªã‚¹ãƒ¬ãƒƒãƒ‰ãŒ native_cond_wait ã—ãã†ãª
時ã¯ã€lock_func を抜ã‘ã¦ãƒ‡ãƒƒãƒ‰ãƒãƒƒã‚¯æ¤œæŸ»ã™ã‚‹ã‚ˆã†ã«ã—ãŸã€‚ -
rb_check_deadlock ã§ã¯ vm->living_threads を列挙ã—ã¦ã€
- 例外状態ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã€ã¾ãŸã¯
- locking_mutex ã®ãƒãƒƒã‚¯ã«æˆåŠŸã—ãŸã‚¹ãƒ¬ãƒƒãƒ‰ã€ã¾ãŸã¯
- locking_mutex ãŒèª°ã«ã‚‚ãƒãƒƒã‚¯ã•ã‚Œã¦ã„ãªã„スレッドã€
ã®ã„ãšã‚Œã‚‚ãªã‘れ㰠main_thread ã« fatal ãªä¾‹å¤–を投ã’ã‚‹
よã†ã«ã—ãŸã€‚
-
スレッドã®çµ‚了時ã«ãƒãƒƒã‚¯ã—ã¦ã„㟠mutex ã‚’ã™ã¹ã¦è§£æ”¾
ã™ã‚‹ã‚ˆã†ã«ã—ãŸã€‚
ã“ã®ãƒ‘ッãƒã¯å…ƒã€… redmine ã® Feature #17 ã«æµã—ãŸã‚‚ã®ã§ã™ãŒã€
以下ã®ä¿®æ£ã‚’è¿½åŠ ã—ã¦ã„ã¾ã™ã€‚
-
thread_win32.c ã®ä¿®æ£ã‚’è¿½åŠ ã—㟠(ãŸã ã—未テスト)
-
Kernel#sleep ã§ãƒ‡ãƒƒãƒ‰ãƒãƒƒã‚¯çŠ¶æ…‹ã«ãªã£ãŸå ´åˆã¯ä¾‹å¤–ã«ã—ãªã„
よã†ã«ã—㟠-
ãƒã‚°ãƒ•ã‚£ã‚¯ã‚¹ã¨ã¡ã‚‡ã£ã¨æœ€é©åŒ–
制é™ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™ã€‚
-
スレッドやãƒãƒƒã‚¯ã®å‡¦ç†ãŒå°‘ã—é‡ããªã‚‹ã€‚
計測ã®ãŸã³ã«å¤‰ã‚ã‚‹ã‘ã‚Œã©ã€ã ã„ãŸã„ã“ã®ãらã„ã§ã™ã€‚
vm3_thread_create_join 6.565 6.586
vm3_thread_mutex 3.023 3.155 -
スレッドãŒãƒãƒƒã‚¯ä¸ã® mutex ㌠GC ã•ã‚Œãªããªã‚‹ã€‚
loop { Mutex.new.lock } # ã©ã‚“ã©ã‚“メモリを消費ã™ã‚‹ -
Thread#join ã€#stop ã€Mutex#lock 以外ã§å›ºã¾ã£ã¦ã„ã‚‹
スレッドãŒã‚ã‚‹ã¨ãƒ‡ãƒƒãƒ‰ãƒãƒƒã‚¯æ¤œå‡ºã—ãªã„。
r, w = IO.pipe; r.read # 固ã¾ã‚Šç¶šã‘ã‚‹
ã©ã‚“ãªã‚‚ã‚“ã§ã—ょã†ã‹ã€‚