2009-10-29 98 views
4

我正在寫一個用戶空間線程庫。我有一個管理每個線程的結構。我的線程非常簡單,它們接受一個函數ptr及其參數,並且只運行一次該函數。pthreads,setjmp,longjmp。如何知道函數何時完成運行?

每個線程都有一個jmp_buf,我使用setjmp和longjmp在線程間切換。我無法弄清楚的一件事是如何判斷此功能何時完成。

對於每個線程,我以兩種方式修改jmpbuf。

  1. 我編輯PC並將其設置爲函數指針,所以程序計數器接下來會出現在那裏。
  2. 我也會讓每個人都有自己的堆棧和編輯SP,使其指向該堆棧

所以用我的線程控制結構,我可以和線程之間進行切換各有一個保持狀態,但不知道如何告訴該功能何時完成。當它結束時,我想調用一個特殊的exit()函數。

回答

2

您可以修改堆棧上的返回地址以指向exit()函數,或者將函數調用包裝在另一個函數中,該函數在其後面調用exit()。

0

它會嘗試返回到最初被調用的位置 - 推測是您的create_thread函數。

2

而不是修改你的電腦到用戶函數,你應該實際上調用一些特殊的函數(我們稱之爲run_thread())分支到該線程的輸入函數。當該入口函數返回時(即線程已經退出),run_thread()應該做任何需要的工作來表明該線程已完成(可能是通過從調度列表中刪除該線程控制塊並將其添加到join()清理列表)。然後它可以產生,並且父進程的ID調用join()時,它將被清除。