2009-08-12 61 views
0

我正在嘗試使用匯編語言級別的線程進行操作。我想存儲有關當前線程的信息,包括線程ID等信息。我當前的想法是在一個對齊的地址處放置一個指向線程信息結構的指針,例如對於1MB堆棧的(ESP & 0xFFE00000)在自定義線程實現中存儲有關當前線程的信息

我看到的直接問題是需要特殊處理,如果我想要堆棧超過1MB,所以我想出了另一個選擇:將所有線程數據結構存儲在鏈表(或數組)中,幷包含線程的開始/結束堆棧範圍作爲結構的一部分。我會保留一個指向列表(或數組)的頭部的指針,該指針位於已知地址處 - 例如與圖像基底的固定偏移量。

這裏有明顯的優點的每個面孔:

  • 方法1(對齊地址)到信息
    • 更快地訪問和無需
    • 但是堆必須全部是同步相同的尺寸並與該邊界對齊
  • 方法2(普通sto憤怒)
    • 堆棧不必是固定大小和他們沒有對齊,以如此大的邊界
    • 我必須對數據的訪問
    • 同步它不會有不哈希表O(1)訪問時間(或上的螺紋與二進制搜索的數目的固定帽 - 偷偷摸摸),和一個哈希表仍然比直接訪問慢

我應該使用這些方法之一還是有更好的方式來訪問我的線程中的這些信息?

回答

1

在我知道的至少兩個操作系統上線程庫使用段寄存器來存儲指向線程特定數據的指針。當然,這主要是一個x86機制,但是因爲你說你的堆棧指針是ESP,那麼我敢打賭那就是你正在使用的架構。無論如何,編譯器通常不會生成使用段寄存器的代碼,並且您正在使用的操作系統可能會將它們保存在上下文交換中。 BSD上的Pthreads使用%fs寄存器。

0

劃出堆疊區域的其他方面與調用框架或推/拉操作無關,這是一種災難。遲早,堆棧將會比你想象的要大。您將開始使用呼叫幀作爲線程ID,或者線程ID將用作返回地址。

你不說什麼線程包,但如果它是PThreads看看pthread_setspecific。其他線程包應該提供類似的功能。

但是從更大的意義上講,您的線程需要了解自己的哪些信息?如果您將執行代碼與執行代碼的環境(線程/進程/其他)分離(在您的頭腦中),多線程編程會變得更加容易。

+0

我沒有使用線程包。這是遊戲的一部分。:)現在,它需要知道它的線程ID,但稍後它需要多一些信息。每種方法都有一個靜態已知的最大幀大小(計算評估堆棧),並且每個調用檢查可用的剩餘堆棧,以便它可以崩潰,但不會運行結束。 – 2009-08-12 18:11:49

+0

咦?所以你正在編寫自己的線程包,它獨立於你的操作系統(如果有的話)提供了什麼?在這種情況下,它應該是一個簡單的問題,即獲取當前的SP(或者也許是SS)並確定哪個線程擁有該堆棧。您需要在某個地方維護該信息以安排您的線程。 – kdgregory 2009-08-12 18:55:49

+0

這符合我發佈的第二個想法。我必須存儲的其他內容是線程名稱,文化,異常信息和分配器信息,因爲我想使用像Hoard這樣的多線程分配器(http://www.hoard.org/)。 – 2009-08-13 01:11:32