電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 56|回復: 0
收起左側

如何查看SoC線程的棧起始地址及大小

[復制鏈接]

660

主題

660

帖子

4567

積分

四級會員

Rank: 4

積分
4567
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-12-5 08:00:00 | 只看該作者 |只看大圖 回帖獎勵 |正序瀏覽 |閱讀模式

+ p/ `! L- S; A8 F' |% y( `點擊上方藍色字體,關注我們
5 g2 a; ?/ w5 q我們可以通過 pthread_attr_t 數(shù)據(jù)結構來獲取或設置線程的棧起始地址和棧大小。8 |; R8 H& [; c* b/ L) E5 i
; V' f" P) u* C$ k) \
要查看線程的棧起始地址和棧大小,使用 pthread_attr_getstack() 函數(shù)。8 `/ ]  t8 j6 J4 y9 {8 k( W

5 `1 S' J, P6 o% H& o$ H9 e$ V它從線程屬性對象中獲取這兩個信息。
. L" z3 z4 q  O( N( i& v& `
; f- w8 V2 _1 _( e  F6 c5 |函數(shù)原型如下:( [3 m/ C/ g! E0 M8 `$ r3 s& V+ G
$ j0 _4 S& Z* p1 @% g# q
  • int pthread_attr_getstack(const pthread_attr_t *attr, void **stackaddr, size_t *stacksize);& X2 b( F7 {9 A$ M0 O3 z$ r# H4 z& y
    參數(shù)說明:2 Q, }! B) l, P3 b' `, K( f8 G
  • attr: 指向線程屬性對象的指針(pthread_attr_t 類型)。
  • stackaddr: 用于存儲線程棧的起始地址,傳遞一個指向 void * 類型的指針,pthread_attr_getstack() 會將棧的起始地址保存在該指針指向的內(nèi)存中。
  • stacksize: 用于存儲線程棧的大小,傳遞一個指向 size_t 類型的指針,pthread_attr_getstack() 會將棧的大小保存在該指針指向的內(nèi)存中。
    : |9 B( _* `5 b. ^- F0 b0 N

    5 E! B2 b7 }) H( |% |$ j返回值:
    ! u1 M; W2 s8 y" O  i
  • 成功返回 0。
  • 失敗返回錯誤碼(非 0 值)。& j  E" F( T! ~7 L0 @& q) L
    - E8 @7 z5 }- p7 F% \& o5 j( F
    如果要設置線程的棧起始地址和棧大小,使用 pthread_attr_setstack() 函數(shù)。5 ]  j- W8 U# _' U& z0 {" U

    + O" _" u# g7 R& p( d其原型如下:
    . v" z- v1 ]. K+ O) G) N2 i8 Q' K) A! l( _2 j
  • int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize);
    , u% F5 _+ Q9 r1 k2 f( i0 i參數(shù)說明:
    ! X5 `0 h+ z6 c1 \* h
  • attr: 指向線程屬性對象的指針,用于設置線程棧的屬性。
  • stackaddr: 指定棧的起始地址。' ~$ F  }3 `% n- t# p
    通常由用戶分配一塊內(nèi)存作為線程棧,然后傳遞它的地址。
  • stacksize: 指定棧的大小,必須是系統(tǒng)允許的最小棧大小之上,通常至少為 PTHREAD_STACK_MIN,否則返回錯誤。0 Z2 W- ~' v- F+ o5 F
    ! R# u6 q3 u  ]' o
    返回值:
    # g: r0 v+ ]4 w& K
  • 成功返回 0。
  • 失敗返回錯誤碼(非 0 值)。
    1 k9 N' K3 Y: o6 b2 X( x
    # d3 \$ c, _1 B  n# \
    以下是獲取線程棧起始地址和棧大小的示例代碼:( B" A; c3 u  X0 Z/ K. _7 M( c5 D

    6 @  _! R: z1 y# K/ H, N" O4 Z
  • void *thread_function(void *arg) {    printf("Thread running...
    ( K9 d6 W  o  r3 L6 I7 |");    pthread_exit(NULL);}
    ! B5 F( \1 C/ s6 aint main() {    pthread_t thread;    pthread_attr_t attr;    void *stackaddr;    size_t stacksize;6 ^5 f+ e) x- x" _0 c% K( G! ^9 _
        // 初始化線程屬性對象    pthread_attr_init(&attr);
    ) ]6 l  y* g0 j' G& r+ Y; p( {    // 獲取默認的棧起始地址和棧大小    pthread_attr_getstack(&attr, &stackaddr, &stacksize);+ ~9 s: L) P. A
        printf("Default stack address: %p
    - U+ W! T. c' t1 B! Z2 |", stackaddr);    printf("Default stack size: %zu bytes9 r, q2 j) H- o
    ", stacksize);% B& H# e% c  C4 W9 F/ a& Y
        // 創(chuàng)建線程    if (pthread_create(&thread, &attr, thread_function, NULL) != 0) {        perror("Failed to create thread");        return 1;    }
    # N! W2 p' D& O+ U. N) Z# m! V    // 等待線程結束    pthread_join(thread, NULL);
    4 h* J% ^7 M! `    // 銷毀線程屬性對象    pthread_attr_destroy(&attr);
    ' L: ?% k: O9 z. m    return 0;}' b4 _- Q: B% J$ `. q
    輸出結果如下:+ t. G! y  O! T. `3 l4 I9 C

      d. e. p' r% V1 j2 ~+ Q7 k5 r1 z
  • Default stack address: 0x7fcd49800000Default stack size: 8388608 bytes# }0 x& p+ c" ?
    除了獲取棧的起始地址和大小外,還可以使用以下函數(shù)單獨獲取或設置棧的大小或起始地址:
    ( Z5 o) M: `3 w. l
  • pthread_attr_setstacksize():設置棧大小。
  • pthread_attr_getstacksize():獲取棧大小。
  • pthread_attr_setstackaddr():設置棧起始地址。
  • pthread_attr_getstackaddr():獲取棧起始地址。/ o/ y, w3 ]4 x: [

    0 i4 B% H* `6 N7 A4 E例如,如果你只想設置棧的大小而不需要改變棧的起始地址,可以使用 pthread_attr_setstacksize():: C% O/ v+ Z6 t' i# Y$ Y7 T: s

    , u& Z- R, y/ O9 U
  • int main() {    pthread_attr_t attr;    size_t stacksize = 16 * 1024 * 1024;  // 設置棧大小為 16 MB
    " a% U: K3 C: I    // 初始化線程屬性    pthread_attr_init(&attr);
    3 k! |) d' P) c4 u! g$ H    // 設置棧大小    pthread_attr_setstacksize(&attr, stacksize);7 ]9 W, S: c; ~* a
        // 獲取并打印新的棧大小    pthread_attr_getstacksize(&attr, &stacksize);    printf("New stack size: %zu bytes  x2 {/ g8 U& P* [6 ^. U+ `, L( V
    ", stacksize);* ?7 D% W+ [" ]4 O4 k. W# F+ P- Z  _
        // 銷毀線程屬性對象    pthread_attr_destroy(&attr);
    " r  I0 F& P: Y# F* a* L    return 0;}6 u1 x0 r3 V4 K* W& G; b& J
    注意事項:
  • 棧大小不能小于系統(tǒng)允許的最小棧大小,可以通過 PTHREAD_STACK_MIN 宏獲得最小值。
  • 手動設置棧地址時,需要確保傳遞的內(nèi)存塊有效且大小合適。; R$ @5 h: ~9 \  O& b+ B$ T
    [/ol]
    6 h5 `8 Q7 P- }: Q) x+ g- ^通過 pthread_attr_getstack() 和 pthread_attr_setstack() 函數(shù),可以方便地獲取和設置線程的棧起始地址和棧大小。
    4 }2 q9 K* }1 h5 T% E! d' a: D  Q& B
    對于需要自定義線程棧的應用程序,合理地管理?臻g可以提高程序的穩(wěn)定性和性能。1 {6 Q* J4 y$ ]- d6 W

    ; p) ~6 b0 L/ q" z1 P2 l1 n在多線程編程中,了解和控制線程的棧使用情況對于高效的內(nèi)存管理和避免棧溢出至關重要。/ j7 V! o$ i4 F6 o# J9 h$ U
    - v. e, y/ `$ m; B9 |7 K
    4 W- b- o, D/ U3 M1 e
    點擊閱讀原文,更精彩~
  • 回復

    使用道具 舉報

    發(fā)表回復

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規(guī)則


    聯(lián)系客服 關注微信 下載APP 返回頂部 返回列表