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

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

搜索
查看: 55|回復(fù): 0
收起左側(cè)

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

[復(fù)制鏈接]

660

主題

660

帖子

4567

積分

四級會員

Rank: 4

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

% f2 b; ?2 Y* }) r1 ~7 T; s2 M  f% W點擊上方藍(lán)色字體,關(guān)注我們+ M# w# ~. a# P- O
我們可以通過 pthread_attr_t 數(shù)據(jù)結(jié)構(gòu)來獲取或設(shè)置線程的棧起始地址和棧大小。# n+ T: F; q! U) w+ E

. G' r: T- j, ], M. ~' x# c4 n7 O( O要查看線程的棧起始地址和棧大小,使用 pthread_attr_getstack() 函數(shù)。
1 i" D8 ?8 t1 a0 g* R. ~. W
5 m0 Y2 w9 ?9 S2 ?& U它從線程屬性對象中獲取這兩個信息。
8 _; G1 d% R* w# X9 L
9 W5 W6 ~8 D/ C0 t& T. Y' S3 s函數(shù)原型如下:7 b, n0 D' x6 J3 z

* V  c4 Z5 z( W2 p
  • int pthread_attr_getstack(const pthread_attr_t *attr, void **stackaddr, size_t *stacksize);' N! X8 L6 k' k$ l  ]
    參數(shù)說明:
    8 V% C" z# t1 P. K' A) |! F
  • attr: 指向線程屬性對象的指針(pthread_attr_t 類型)。
  • stackaddr: 用于存儲線程棧的起始地址,傳遞一個指向 void * 類型的指針,pthread_attr_getstack() 會將棧的起始地址保存在該指針指向的內(nèi)存中。
  • stacksize: 用于存儲線程棧的大小,傳遞一個指向 size_t 類型的指針,pthread_attr_getstack() 會將棧的大小保存在該指針指向的內(nèi)存中。8 ]- ~8 e5 x  n% ?: W

    - L/ B$ `( w1 d返回值:
    4 T+ j; ^! m( r/ e; r8 Q8 k
  • 成功返回 0。
  • 失敗返回錯誤碼(非 0 值)。
    $ C2 h9 [2 O1 ~4 r6 C
    6 `. C6 r5 Z+ ]/ X6 ~
    如果要設(shè)置線程的棧起始地址和棧大小,使用 pthread_attr_setstack() 函數(shù)。' A- D% |4 O+ A

    7 y" W5 P) t" q4 k2 H1 e& @其原型如下:
    9 Z) Y2 ?) t7 }  s& L* ~% n
    6 S1 e' x9 W* T* a+ q* B
  • int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize);: W7 q( f2 P9 c  K; {
    參數(shù)說明:
    8 F$ K4 n. U: o+ F3 i
  • attr: 指向線程屬性對象的指針,用于設(shè)置線程棧的屬性。
  • stackaddr: 指定棧的起始地址。1 L) \4 ]3 e& d6 o
    通常由用戶分配一塊內(nèi)存作為線程棧,然后傳遞它的地址。
  • stacksize: 指定棧的大小,必須是系統(tǒng)允許的最小棧大小之上,通常至少為 PTHREAD_STACK_MIN,否則返回錯誤。
    , \) ?0 R3 t$ u  M) m  g3 x  o7 C/ t2 ~

    $ z" R9 M0 y" R' Y5 k返回值:  W8 P. V3 Z4 ?* G6 b4 m  U( {
  • 成功返回 0。
  • 失敗返回錯誤碼(非 0 值)。9 K6 e2 [9 d! F# I

    5 x7 C# e' v  w* r以下是獲取線程棧起始地址和棧大小的示例代碼:
    4 Y; j2 [: H% Z1 D( G6 A: S& H" I4 r. B7 D3 f# s" L! @$ B1 _4 r
  • void *thread_function(void *arg) {    printf("Thread running...
    3 K. [# ~  X. E' t9 i  o7 g");    pthread_exit(NULL);}: s" ^) P9 Y- b/ c1 J  C  W
    int main() {    pthread_t thread;    pthread_attr_t attr;    void *stackaddr;    size_t stacksize;
    3 a8 C0 J, ]8 H9 O3 q) @! r$ f) p    // 初始化線程屬性對象    pthread_attr_init(&attr);. V; w/ Z& F( X/ D% o1 l! {
        // 獲取默認(rèn)的棧起始地址和棧大小    pthread_attr_getstack(&attr, &stackaddr, &stacksize);: E2 a. R* Z6 ^5 h
        printf("Default stack address: %p
    8 t3 D: c) A0 }7 r", stackaddr);    printf("Default stack size: %zu bytes
    / }7 Y1 D9 N: r' t/ W", stacksize);
    4 _! `. V& s  X6 G3 R3 b1 t4 J6 h    // 創(chuàng)建線程    if (pthread_create(&thread, &attr, thread_function, NULL) != 0) {        perror("Failed to create thread");        return 1;    }3 M' U5 Q' g( h# N: j6 w
        // 等待線程結(jié)束    pthread_join(thread, NULL);( M& N! E4 ]: y% C5 C/ b7 D9 ^0 Z- `
        // 銷毀線程屬性對象    pthread_attr_destroy(&attr);
    4 u0 ]* T2 ]2 M6 U6 y+ ~    return 0;}* f/ Y% a# a+ `& N( R) K1 W5 \
    輸出結(jié)果如下:3 a$ u; f2 z1 R1 x- V
    # [/ P$ R: k$ Z. W3 Y: V: [! w
  • Default stack address: 0x7fcd49800000Default stack size: 8388608 bytes' w8 L/ h& K5 a# }* \) _
    除了獲取棧的起始地址和大小外,還可以使用以下函數(shù)單獨獲取或設(shè)置棧的大小或起始地址:8 g, g/ c& X) c2 d' q
  • pthread_attr_setstacksize():設(shè)置棧大小。
  • pthread_attr_getstacksize():獲取棧大小。
  • pthread_attr_setstackaddr():設(shè)置棧起始地址。
  • pthread_attr_getstackaddr():獲取棧起始地址。9 h0 G' H( }5 u8 D( p0 f. E3 L

    6 {' [2 e$ T8 y# y2 I! |8 Q例如,如果你只想設(shè)置棧的大小而不需要改變棧的起始地址,可以使用 pthread_attr_setstacksize():
    - K+ n  e+ c) m8 b+ n# D# s8 f0 f  d
  • int main() {    pthread_attr_t attr;    size_t stacksize = 16 * 1024 * 1024;  // 設(shè)置棧大小為 16 MB! _- P0 K) z) z
        // 初始化線程屬性    pthread_attr_init(&attr);0 E) I  ~/ t4 A( `" S  b
        // 設(shè)置棧大小    pthread_attr_setstacksize(&attr, stacksize);
    ! c2 l1 t) ]* P0 i8 W+ z# X    // 獲取并打印新的棧大小    pthread_attr_getstacksize(&attr, &stacksize);    printf("New stack size: %zu bytes  Z% x# Y4 E" G. x) }2 h
    ", stacksize);
    % x1 I  a1 X2 E* t% z    // 銷毀線程屬性對象    pthread_attr_destroy(&attr);
    ' d$ H. }7 Y- c6 _    return 0;}( C# i" z" `9 w, t/ }! D1 g/ Z
    注意事項:
  • 棧大小不能小于系統(tǒng)允許的最小棧大小,可以通過 PTHREAD_STACK_MIN 宏獲得最小值。
  • 手動設(shè)置棧地址時,需要確保傳遞的內(nèi)存塊有效且大小合適。
    " p+ U$ s0 }2 ^1 s[/ol]# W1 t5 d* s8 w9 u% j
    通過 pthread_attr_getstack() 和 pthread_attr_setstack() 函數(shù),可以方便地獲取和設(shè)置線程的棧起始地址和棧大小。% C8 v4 \( ]8 _" N0 V2 A

    + g0 u) t+ r* n; R對于需要自定義線程棧的應(yīng)用程序,合理地管理?臻g可以提高程序的穩(wěn)定性和性能。
    9 q) x* b3 s' }; ~7 c: i" w' h  i! t9 h8 g. d
    在多線程編程中,了解和控制線程的棧使用情況對于高效的內(nèi)存管理和避免棧溢出至關(guān)重要。
      P$ r# O7 a+ {& e9 ]4 P# H
    $ w; s4 `3 m: u4 Z8 m" ?) m
    ; D* U: \* t4 `0 F. p' C* v( y點擊閱讀原文,更精彩~
  • 回復(fù)

    使用道具 舉報

    發(fā)表回復(fù)

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

    本版積分規(guī)則


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