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

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

搜索
查看: 54|回復(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覽 |閱讀模式
" {$ W, K. i# L* z6 }" m  v
點(diǎn)擊上方藍(lán)色字體,關(guān)注我們0 d3 a- W6 Z% j3 s0 {9 U. J
我們可以通過(guò) pthread_attr_t 數(shù)據(jù)結(jié)構(gòu)來(lái)獲取或設(shè)置線程的棧起始地址和棧大小。
' s( p8 [! E5 e0 R8 r" K& O1 j; v% H/ p% \4 h' y
要查看線程的棧起始地址和棧大小,使用 pthread_attr_getstack() 函數(shù)。9 @; D& R# x7 b3 G; H
" I# P. `  h! j; l* c6 I5 h( d% o3 ]
它從線程屬性對(duì)象中獲取這兩個(gè)信息。, J' W& h% \3 J! P: |0 h- Y/ r
+ {  \  R6 h6 D- p
函數(shù)原型如下:
1 g7 F+ R" j+ z- B$ _$ k# z9 N9 G3 M) Z1 p. K
  • int pthread_attr_getstack(const pthread_attr_t *attr, void **stackaddr, size_t *stacksize);
    ' u! H% [, P4 }/ `( G- @$ s) Y參數(shù)說(shuō)明:
    , \/ E) V! _% ^' y2 b0 J
  • 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)存中。$ M; I3 u  n9 T5 _
    ( M, h& O1 c: E; A& ~6 @" q
    返回值:
    + E' G$ R! W+ j" F9 P
  • 成功返回 0。
  • 失敗返回錯(cuò)誤碼(非 0 值)。
    ( f' Q- m* u+ y' h

    1 h4 T4 t3 p- k8 F# F如果要設(shè)置線程的棧起始地址和棧大小,使用 pthread_attr_setstack() 函數(shù)。# B+ T- l3 \3 Q$ Z$ z$ R

    ; \( y1 K$ p0 ?& n* C. O1 @! t9 _- g其原型如下:; A9 |, B# @- r, S7 Q, z
    / D& `$ M) l2 @
  • int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize);: f6 s2 o  _/ }6 s0 ?% X
    參數(shù)說(shuō)明:
    & r: O" e2 y6 z3 a# n8 l% S* W
  • attr: 指向線程屬性對(duì)象的指針,用于設(shè)置線程棧的屬性。
  • stackaddr: 指定棧的起始地址。
    3 ^- r* O% Z* q$ T/ j( W) N通常由用戶分配一塊內(nèi)存作為線程棧,然后傳遞它的地址。
  • stacksize: 指定棧的大小,必須是系統(tǒng)允許的最小棧大小之上,通常至少為 PTHREAD_STACK_MIN,否則返回錯(cuò)誤。% O! y  c0 Y1 {6 ?: a) w
    4 h/ G9 G$ S/ C: [
    返回值:
    7 P4 o* c5 `; K0 B' l7 p/ o' ^
  • 成功返回 0。
  • 失敗返回錯(cuò)誤碼(非 0 值)。- L2 P. B, v" n& t4 {- |

    + ]. _) J4 q/ M/ `* j以下是獲取線程棧起始地址和棧大小的示例代碼:
    & L% U/ c7 P5 h5 B% L+ F. `/ R. y, S" w
  • void *thread_function(void *arg) {    printf("Thread running...6 N; p  t9 ~5 N& D% v8 C; \" s
    ");    pthread_exit(NULL);}! \8 h. K& A$ |& a
    int main() {    pthread_t thread;    pthread_attr_t attr;    void *stackaddr;    size_t stacksize;
    . q) Q' E; p+ n5 l# b    // 初始化線程屬性對(duì)象    pthread_attr_init(&attr);
    " q% T& y' G( n  t) s  ?% e7 R    // 獲取默認(rèn)的棧起始地址和棧大小    pthread_attr_getstack(&attr, &stackaddr, &stacksize);6 G3 d1 x$ I% F
        printf("Default stack address: %p
    & f; X/ d9 m" z", stackaddr);    printf("Default stack size: %zu bytes9 ?  z7 ?* W' Z( [  ?2 H2 Q3 K
    ", stacksize);, [$ J! E: }( r& S: J
        // 創(chuàng)建線程    if (pthread_create(&thread, &attr, thread_function, NULL) != 0) {        perror("Failed to create thread");        return 1;    }
    + p+ e1 @- r* w" n4 n. T) y    // 等待線程結(jié)束    pthread_join(thread, NULL);
    5 S# I5 t. e- ], O* [+ }* f7 |    // 銷毀線程屬性對(duì)象    pthread_attr_destroy(&attr);
    ; R& n, R7 P  D$ N6 u" D' R    return 0;}0 u( @- Q' T. k+ ^$ |' ?7 G
    輸出結(jié)果如下:
    # H4 c0 a- `, @5 {' F# O
    7 M1 L* q, i% D2 i$ w
  • Default stack address: 0x7fcd49800000Default stack size: 8388608 bytes3 @, U6 u/ @. B, ~; T1 K
    除了獲取棧的起始地址和大小外,還可以使用以下函數(shù)單獨(dú)獲取或設(shè)置棧的大小或起始地址:
    5 ]! e* C8 v2 W/ R1 J3 v+ l0 s
  • pthread_attr_setstacksize():設(shè)置棧大小。
  • pthread_attr_getstacksize():獲取棧大小。
  • pthread_attr_setstackaddr():設(shè)置棧起始地址。
  • pthread_attr_getstackaddr():獲取棧起始地址。
    ; Q% |$ E3 m. g6 P5 u

    0 a# b- [9 C( |+ I/ L* F1 U* ^* F( b例如,如果你只想設(shè)置棧的大小而不需要改變棧的起始地址,可以使用 pthread_attr_setstacksize():2 t7 o( S# {1 U2 t2 T  b6 _0 v

    7 F7 C3 b) k6 y! }/ Y
  • int main() {    pthread_attr_t attr;    size_t stacksize = 16 * 1024 * 1024;  // 設(shè)置棧大小為 16 MB1 U1 _. R: i/ a- L- ]4 U
        // 初始化線程屬性    pthread_attr_init(&attr);% W1 v6 s' K- T: s. W% C2 i, h
        // 設(shè)置棧大小    pthread_attr_setstacksize(&attr, stacksize);
    # c; d, f  {. O' X) ^    // 獲取并打印新的棧大小    pthread_attr_getstacksize(&attr, &stacksize);    printf("New stack size: %zu bytes
    ( ~& A2 n; v& B: \, ~", stacksize);
    6 T% Y( e5 E, w; X    // 銷毀線程屬性對(duì)象    pthread_attr_destroy(&attr);/ _3 s6 A5 a/ W7 `: Y9 A9 |8 z
        return 0;}
    ( {) ~* w/ {3 v# F4 M注意事項(xiàng):
  • 棧大小不能小于系統(tǒng)允許的最小棧大小,可以通過(guò) PTHREAD_STACK_MIN 宏獲得最小值。
  • 手動(dòng)設(shè)置棧地址時(shí),需要確保傳遞的內(nèi)存塊有效且大小合適。
    & F3 x8 B) m" [; c. w5 [5 Q7 E[/ol]
    ; |0 W) U/ ]$ o$ I! v  a3 \通過(guò) pthread_attr_getstack() 和 pthread_attr_setstack() 函數(shù),可以方便地獲取和設(shè)置線程的棧起始地址和棧大小。
    9 K% G9 z1 y6 V3 H5 ]; f. `* }5 H$ O: `! |& R7 j
    對(duì)于需要自定義線程棧的應(yīng)用程序,合理地管理?xiàng)?臻g可以提高程序的穩(wěn)定性和性能。
    ( q7 |* E. e6 C1 c9 r. ?0 c1 e9 @: r
    在多線程編程中,了解和控制線程的棧使用情況對(duì)于高效的內(nèi)存管理和避免棧溢出至關(guān)重要。
    3 }: V- j: e0 S
    * W) f4 Z/ D  g/ ~
    0 [' m( m# N% [  u% ]點(diǎn)擊閱讀原文,更精彩~
  • 發(fā)表回復(fù)

    本版積分規(guī)則


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