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

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

搜索
查看: 49|回復(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覽 |閱讀模式

+ Y, v' |8 [7 d  g點(diǎn)擊上方藍(lán)色字體,關(guān)注我們2 E  _# H8 I/ P. o
我們可以通過(guò) pthread_attr_t 數(shù)據(jù)結(jié)構(gòu)來(lái)獲取或設(shè)置線程的棧起始地址和棧大小。
8 z  `8 p/ \8 P# O& `# `% w" s# b) w- F% X: O
要查看線程的棧起始地址和棧大小,使用 pthread_attr_getstack() 函數(shù)。
& c/ z+ A) H$ o# h. F& X4 Y# [
5 M, V0 F$ A0 Q2 I4 m它從線程屬性對(duì)象中獲取這兩個(gè)信息。
5 I8 D% Z( `# W) K1 a/ k
5 D  w3 P/ @: B* \/ E. P函數(shù)原型如下:
% s- w3 Z( ]( I4 H; l2 V$ k
. \. i: \7 D+ |- p& m$ d
  • int pthread_attr_getstack(const pthread_attr_t *attr, void **stackaddr, size_t *stacksize);" O8 B! b* |' `1 t+ ^% [
    參數(shù)說(shuō)明:7 s# C# [7 d; _; @; @8 m+ y3 ?# `
  • 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)存中。
    ! H' n- D& A3 Y
    7 @, {9 N" H3 @4 g4 Z2 Z
    返回值:, Y1 Z" K: {6 \/ Z! }7 {/ G4 l% a
  • 成功返回 0。
  • 失敗返回錯(cuò)誤碼(非 0 值)。4 P% N+ y& n9 U  z( C' ~0 I

    ; X1 h! y0 i8 |3 D# I如果要設(shè)置線程的棧起始地址和棧大小,使用 pthread_attr_setstack() 函數(shù)。
    $ M: b  H# t) y4 X3 r8 c9 J3 e
    3 f2 {6 ]. h' O' i1 s* i6 H4 E8 e其原型如下:$ a7 c, Z- a5 V: p8 W8 |: n4 p

    - j) H' U; u8 F: x/ P8 j6 m' u" N* N. }
  • int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize);, m0 X5 m+ H. F' W" E
    參數(shù)說(shuō)明:
    / m" N* O6 T1 T  l% x& ^7 U+ f
  • attr: 指向線程屬性對(duì)象的指針,用于設(shè)置線程棧的屬性。
  • stackaddr: 指定棧的起始地址。
    * M6 V, G; t" o3 K& w$ E通常由用戶分配一塊內(nèi)存作為線程棧,然后傳遞它的地址。
  • stacksize: 指定棧的大小,必須是系統(tǒng)允許的最小棧大小之上,通常至少為 PTHREAD_STACK_MIN,否則返回錯(cuò)誤。
    ; w/ \2 b7 g2 S3 s; b

    ' C& i" r( g% o4 b返回值:. X( Y" ^- E4 h* I  R) V& K/ X
  • 成功返回 0。
  • 失敗返回錯(cuò)誤碼(非 0 值)。1 e0 v" V2 g, P" s! K

    9 z- u% s/ F5 B# C6 J! D  p' i以下是獲取線程棧起始地址和棧大小的示例代碼:
    : r. C8 J7 a3 D" s+ E* ]  x
    5 K  [& `9 Q, t$ f
  • void *thread_function(void *arg) {    printf("Thread running.... t3 I/ U3 y5 F3 V& w! ^, e
    ");    pthread_exit(NULL);}9 u7 U/ _% l: ]* M7 `, H! k
    int main() {    pthread_t thread;    pthread_attr_t attr;    void *stackaddr;    size_t stacksize;3 n+ s# \- Q# @6 Y
        // 初始化線程屬性對(duì)象    pthread_attr_init(&attr);
    / P8 U# Q6 {3 d; a% f; q+ Q4 L" U1 ^    // 獲取默認(rèn)的棧起始地址和棧大小    pthread_attr_getstack(&attr, &stackaddr, &stacksize);6 `4 X9 ]) N. q1 o, l$ v' f' ~5 V
        printf("Default stack address: %p5 L' ~' ^7 l# `" F' f# n
    ", stackaddr);    printf("Default stack size: %zu bytes
    0 Y0 u/ r. G( k", stacksize);
    : ]; y5 h, m/ _6 W% O5 n    // 創(chuàng)建線程    if (pthread_create(&thread, &attr, thread_function, NULL) != 0) {        perror("Failed to create thread");        return 1;    }
    . j* j  b3 I: w: V    // 等待線程結(jié)束    pthread_join(thread, NULL);
    + w# H) i- p( L/ Q) x7 v) ]7 n    // 銷毀線程屬性對(duì)象    pthread_attr_destroy(&attr);
    + x6 s8 Y0 M& w& ^. n2 y    return 0;}
    : N  `7 P/ Y' g" c$ _7 u輸出結(jié)果如下:
    2 N9 e1 l# \- |) s
    . O. f" A5 O! `/ @' {  C
  • Default stack address: 0x7fcd49800000Default stack size: 8388608 bytes0 E0 x- l, I+ U- t
    除了獲取棧的起始地址和大小外,還可以使用以下函數(shù)單獨(dú)獲取或設(shè)置棧的大小或起始地址:  v2 U- F0 k% O& L; g. S+ F
  • pthread_attr_setstacksize():設(shè)置棧大小。
  • pthread_attr_getstacksize():獲取棧大小。
  • pthread_attr_setstackaddr():設(shè)置棧起始地址。
  • pthread_attr_getstackaddr():獲取棧起始地址。
    * T. M( f: M9 \9 ~6 F

    " g. X' }! d# e9 G$ v- Y" P例如,如果你只想設(shè)置棧的大小而不需要改變棧的起始地址,可以使用 pthread_attr_setstacksize():
    ; T- @6 v5 {0 S9 P' |$ |2 m+ O
    5 ]6 X4 D8 [* m/ L' k1 y
  • int main() {    pthread_attr_t attr;    size_t stacksize = 16 * 1024 * 1024;  // 設(shè)置棧大小為 16 MB" }, A7 z  a! H; d) N" Q
        // 初始化線程屬性    pthread_attr_init(&attr);, _: K# \; w! m/ c, l( x
        // 設(shè)置棧大小    pthread_attr_setstacksize(&attr, stacksize);- m! R9 x3 C; c6 U6 n" g
        // 獲取并打印新的棧大小    pthread_attr_getstacksize(&attr, &stacksize);    printf("New stack size: %zu bytes
    0 l" _& @3 q+ I, \- T$ G", stacksize);
    ! V; b4 p: _$ ^7 x    // 銷毀線程屬性對(duì)象    pthread_attr_destroy(&attr);
    1 t$ u3 x# B8 T/ z  H' A    return 0;}- {, Z4 @) V5 ~* A; t1 T
    注意事項(xiàng):
  • 棧大小不能小于系統(tǒng)允許的最小棧大小,可以通過(guò) PTHREAD_STACK_MIN 宏獲得最小值。
  • 手動(dòng)設(shè)置棧地址時(shí),需要確保傳遞的內(nèi)存塊有效且大小合適。: H% J/ m3 G$ S8 e) O
    [/ol]0 m- o- u, U+ T1 U8 d  |
    通過(guò) pthread_attr_getstack() 和 pthread_attr_setstack() 函數(shù),可以方便地獲取和設(shè)置線程的棧起始地址和棧大小。
    0 w: I( q2 {  s- A6 k$ B% G2 f3 ]5 g) K5 F
    對(duì)于需要自定義線程棧的應(yīng)用程序,合理地管理?xiàng)?臻g可以提高程序的穩(wěn)定性和性能。
    ! L3 R3 X3 g; z5 S- k& P& X& t6 C3 @2 L- r+ p8 k( m! Z
    在多線程編程中,了解和控制線程的棧使用情況對(duì)于高效的內(nèi)存管理和避免棧溢出至關(guān)重要。' I5 Q* i! ^2 [$ M

    * z% j& h( o$ L; ]+ X0 c. A0 ^
    * v  V8 u: `/ b! ]+ p* F7 v點(diǎn)擊閱讀原文,更精彩~
  • 發(fā)表回復(fù)

    本版積分規(guī)則


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