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

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

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

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

[復(fù)制鏈接]

660

主題

660

帖子

4567

積分

四級(jí)會(huì)員

Rank: 4

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

* G7 u+ ~/ {4 M. J3 T點(diǎn)擊上方藍(lán)色字體,關(guān)注我們  e3 }4 S/ r; M" ?2 l
我們可以通過 pthread_attr_t 數(shù)據(jù)結(jié)構(gòu)來獲取或設(shè)置線程的棧起始地址和棧大小。
  a7 l) q- I! }- l5 V- u  a4 L0 }$ z  u7 u4 b4 S8 A
要查看線程的棧起始地址和棧大小,使用 pthread_attr_getstack() 函數(shù)。: t8 x6 O5 Q9 F7 ?' o5 k
2 \5 w' m# E0 b
它從線程屬性對(duì)象中獲取這兩個(gè)信息。
" D3 H1 I/ B1 y0 n
7 u8 w0 l7 k* L$ p' ~& W/ N2 }函數(shù)原型如下:( n* J% G1 O# t# E6 e

" g9 @& y0 ^, m5 `
  • int pthread_attr_getstack(const pthread_attr_t *attr, void **stackaddr, size_t *stacksize);3 O; e+ N# J$ U4 s7 m0 X4 z; `
    參數(shù)說明:4 R$ ]/ f! v) ^) Q' J7 X! h
  • attr: 指向線程屬性對(duì)象的指針(pthread_attr_t 類型)。
  • stackaddr: 用于存儲(chǔ)線程棧的起始地址,傳遞一個(gè)指向 void * 類型的指針,pthread_attr_getstack() 會(huì)將棧的起始地址保存在該指針指向的內(nèi)存中。
  • stacksize: 用于存儲(chǔ)線程棧的大小,傳遞一個(gè)指向 size_t 類型的指針,pthread_attr_getstack() 會(huì)將棧的大小保存在該指針指向的內(nèi)存中。+ F8 b3 _* Y: c$ w: z6 r
    : S% |( K( b0 p& A' b
    返回值:7 I9 u7 h- y) X$ ?4 u$ d
  • 成功返回 0。
  • 失敗返回錯(cuò)誤碼(非 0 值)。
    3 X" [3 w4 f* Z

    - [% F8 k0 k9 m$ S& l5 O7 b如果要設(shè)置線程的棧起始地址和棧大小,使用 pthread_attr_setstack() 函數(shù)。% X7 ~$ M  e- p7 m( Q
    ! }& z- S) W8 i% H' _. W1 ]
    其原型如下:  E4 [8 ~/ J( Z, h

    & p  ^" N! n9 Q  M
  • int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize);- K) g( T5 d. d6 R' E) f  j
    參數(shù)說明:" z# G6 U" o6 b
  • attr: 指向線程屬性對(duì)象的指針,用于設(shè)置線程棧的屬性。
  • stackaddr: 指定棧的起始地址。
    , e: ]( R( u" `' C' l5 P5 C5 X通常由用戶分配一塊內(nèi)存作為線程棧,然后傳遞它的地址。
  • stacksize: 指定棧的大小,必須是系統(tǒng)允許的最小棧大小之上,通常至少為 PTHREAD_STACK_MIN,否則返回錯(cuò)誤。; N" s. T7 m- ]! k. ]

    5 F* J/ ?! |5 d6 J0 ^5 b) w  ~$ {/ {返回值:& T, `7 S+ i9 y5 B5 ?
  • 成功返回 0。
  • 失敗返回錯(cuò)誤碼(非 0 值)。
    8 r; O. U1 s# O/ B8 v- b! e: P
    % n/ ^4 N- D2 ^
    以下是獲取線程棧起始地址和棧大小的示例代碼:
    % b2 }6 I  J/ M0 k  ^) R8 O3 K9 L4 V0 \% f; L. h
  • void *thread_function(void *arg) {    printf("Thread running...
    2 v- j9 W! O: Y+ r) r( F");    pthread_exit(NULL);}4 p* G, O* W, x/ T+ F4 z
    int main() {    pthread_t thread;    pthread_attr_t attr;    void *stackaddr;    size_t stacksize;
    2 j3 x7 @$ x: @) T% R8 w" j5 j    // 初始化線程屬性對(duì)象    pthread_attr_init(&attr);
    # `* ]* ?3 l8 c7 }9 ~    // 獲取默認(rèn)的棧起始地址和棧大小    pthread_attr_getstack(&attr, &stackaddr, &stacksize);* p) \4 L. n# d+ Z& D
        printf("Default stack address: %p% \2 @* X$ b+ f4 x+ b
    ", stackaddr);    printf("Default stack size: %zu bytes
    , k6 G/ Q/ I, x, z: \", stacksize);
    # B1 }& m6 Q3 T2 V3 U+ e1 ]    // 創(chuàng)建線程    if (pthread_create(&thread, &attr, thread_function, NULL) != 0) {        perror("Failed to create thread");        return 1;    }  D+ e" m' @( Z  ]! r4 O& m
        // 等待線程結(jié)束    pthread_join(thread, NULL);5 Y" D0 ?# v" d/ z8 s6 [
        // 銷毀線程屬性對(duì)象    pthread_attr_destroy(&attr);
    3 P/ P; q6 v; e4 K3 O$ a" N( u    return 0;}0 ]+ r+ X& R6 M
    輸出結(jié)果如下:  F3 ~7 J, L; J8 j; T
    & C' K6 s, N3 ^
  • Default stack address: 0x7fcd49800000Default stack size: 8388608 bytes
    # y; p: p5 }- b# X除了獲取棧的起始地址和大小外,還可以使用以下函數(shù)單獨(dú)獲取或設(shè)置棧的大小或起始地址:
    9 C( Z( D4 a; N/ D4 |7 k  X
  • pthread_attr_setstacksize():設(shè)置棧大小。
  • pthread_attr_getstacksize():獲取棧大小。
  • pthread_attr_setstackaddr():設(shè)置棧起始地址。
  • pthread_attr_getstackaddr():獲取棧起始地址。' q8 C; v/ |: K' }8 E* @
    8 X4 Y, s+ n) t1 }% ~4 o. j
    例如,如果你只想設(shè)置棧的大小而不需要改變棧的起始地址,可以使用 pthread_attr_setstacksize():6 d; [. e# B# v" o1 e! D* c

    . B6 E; q: U& T
  • int main() {    pthread_attr_t attr;    size_t stacksize = 16 * 1024 * 1024;  // 設(shè)置棧大小為 16 MB7 P1 G# O" j  x) W$ F  T5 b
        // 初始化線程屬性    pthread_attr_init(&attr);" ^9 h' }, w$ ?1 ]% g1 G& \
        // 設(shè)置棧大小    pthread_attr_setstacksize(&attr, stacksize);# r9 e6 \! m* r9 h
        // 獲取并打印新的棧大小    pthread_attr_getstacksize(&attr, &stacksize);    printf("New stack size: %zu bytes+ A: E2 Q; C+ U: T" \
    ", stacksize);
    * B; b* h) i0 J    // 銷毀線程屬性對(duì)象    pthread_attr_destroy(&attr);
    + m5 t( L3 A2 j    return 0;}
    7 T! m1 k6 K! ]4 Z; G9 C% D2 X1 L注意事項(xiàng):
  • 棧大小不能小于系統(tǒng)允許的最小棧大小,可以通過 PTHREAD_STACK_MIN 宏獲得最小值。
  • 手動(dòng)設(shè)置棧地址時(shí),需要確保傳遞的內(nèi)存塊有效且大小合適。
    , N/ R( Y& p. o$ a8 X1 u[/ol]: j' q3 ~0 @/ |  T8 Z. _
    通過 pthread_attr_getstack() 和 pthread_attr_setstack() 函數(shù),可以方便地獲取和設(shè)置線程的棧起始地址和棧大小。; l) R. _2 g  j

    * _* X% B, m) F: `1 y' [6 [對(duì)于需要自定義線程棧的應(yīng)用程序,合理地管理?xiàng)?臻g可以提高程序的穩(wěn)定性和性能。! O8 o8 r" @) q2 u' j
    5 F6 W4 t! B8 ?4 Y  M
    在多線程編程中,了解和控制線程的棧使用情況對(duì)于高效的內(nèi)存管理和避免棧溢出至關(guān)重要。
    % i/ F. O* D5 s! L, B 8 `# F4 R0 c, `7 `* K+ v- f; O. w

    4 \+ U1 D% `$ D3 M# O. A; |點(diǎn)擊閱讀原文,更精彩~
  • 發(fā)表回復(fù)

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

    本版積分規(guī)則


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