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

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

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

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

[復制鏈接]

660

主題

660

帖子

4567

積分

四級會員

Rank: 4

積分
4567
跳轉到指定樓層
樓主
發(fā)表于 2024-12-5 08:00:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
$ S; Z2 ?2 N! c! E8 d
點擊上方藍色字體,關注我們
, @, v" G$ a. @我們可以通過 pthread_attr_t 數(shù)據(jù)結構來獲取或設置線程的棧起始地址和棧大小。
& ^9 ~6 v1 X# J) L$ ^/ @2 v" o: f4 c1 v" i
要查看線程的棧起始地址和棧大小,使用 pthread_attr_getstack() 函數(shù)。
" r1 m2 n7 s4 t& y& v* ]# @9 _; P2 C/ {6 U- f0 m
它從線程屬性對象中獲取這兩個信息。
6 x$ h: F% ]; _/ c5 A6 r. F8 a9 i4 S$ u" ~" D( D- v
函數(shù)原型如下:
8 Z1 H! d' a3 Z0 o
9 Z2 F( g/ u7 E3 k6 I. {( H/ G2 F
  • int pthread_attr_getstack(const pthread_attr_t *attr, void **stackaddr, size_t *stacksize);# y( E* F, R$ K4 F9 J4 I
    參數(shù)說明:
    " r2 G, e: N: V; q' s; u7 h/ U% y/ X: H8 W
  • attr: 指向線程屬性對象的指針(pthread_attr_t 類型)。
  • stackaddr: 用于存儲線程棧的起始地址,傳遞一個指向 void * 類型的指針,pthread_attr_getstack() 會將棧的起始地址保存在該指針指向的內(nèi)存中。
  • stacksize: 用于存儲線程棧的大小,傳遞一個指向 size_t 類型的指針,pthread_attr_getstack() 會將棧的大小保存在該指針指向的內(nèi)存中。
    # D$ F9 }/ |" s' ]

    1 N& L+ t$ I- ?# W6 z$ k' W返回值:
    * N. w6 q5 g. C0 B  F
  • 成功返回 0。
  • 失敗返回錯誤碼(非 0 值)。
    % o' M8 e: m; s5 U5 y# @( w
    1 f7 _- h/ \! A# r1 e  z# h; l
    如果要設置線程的棧起始地址和棧大小,使用 pthread_attr_setstack() 函數(shù)。
    ! D1 q  M" K, _' ~' e( D) I! ~7 j
    3 t$ E5 K9 w, k  Y/ s* o其原型如下:
    & ^( J9 d$ l2 H, y; c6 X
    . A8 b9 v3 n/ ~# ?* l" e
  • int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize);* x- @5 l1 O. K4 B7 J# W  q+ L
    參數(shù)說明:& Q  ~7 h/ I1 L/ U$ l
  • attr: 指向線程屬性對象的指針,用于設置線程棧的屬性。
  • stackaddr: 指定棧的起始地址。; |3 W' c6 O  N- [
    通常由用戶分配一塊內(nèi)存作為線程棧,然后傳遞它的地址。
  • stacksize: 指定棧的大小,必須是系統(tǒng)允許的最小棧大小之上,通常至少為 PTHREAD_STACK_MIN,否則返回錯誤。
    % p# k7 p5 l9 M. V9 N' Z5 B: j
    ! {- l7 ~3 f9 C" b) q/ [. O7 C! L6 }
    返回值:
    . K8 w% f1 `/ Z' J. E& @& k
  • 成功返回 0。
  • 失敗返回錯誤碼(非 0 值)。. S7 H( ?! C- k+ |# ~- O& a

    3 p2 {" u. z9 y以下是獲取線程棧起始地址和棧大小的示例代碼:) T0 x0 t7 A; n8 P4 K

    # r5 M; s5 ]6 h/ Y% Z/ Z
  • void *thread_function(void *arg) {    printf("Thread running...& C& ~- Y0 T4 B5 e1 F: }
    ");    pthread_exit(NULL);}
    5 B" U) K2 P  l" ^int main() {    pthread_t thread;    pthread_attr_t attr;    void *stackaddr;    size_t stacksize;1 T" n. m  `' P& ?
        // 初始化線程屬性對象    pthread_attr_init(&attr);" U, Y; [! v- h
        // 獲取默認的棧起始地址和棧大小    pthread_attr_getstack(&attr, &stackaddr, &stacksize);% f: U6 k" ?8 t- a0 I
        printf("Default stack address: %p! t& P- H9 w0 @8 `
    ", stackaddr);    printf("Default stack size: %zu bytes9 w* M/ p; m# ]9 ~
    ", stacksize);
    * V! K6 n# s; ~' d+ T; E" D    // 創(chuàng)建線程    if (pthread_create(&thread, &attr, thread_function, NULL) != 0) {        perror("Failed to create thread");        return 1;    }, \5 K9 Z( [( i0 p# ^0 {
        // 等待線程結束    pthread_join(thread, NULL);
    1 N' N1 ~$ B/ A) d4 Z- {    // 銷毀線程屬性對象    pthread_attr_destroy(&attr);% g! c8 n: |' Y7 ~, h* \
        return 0;}9 X2 K1 ?9 ?2 G
    輸出結果如下:
    ! h8 o4 p2 P) N3 S( p, d4 U) H" z- [+ _- r0 R) R/ S
  • Default stack address: 0x7fcd49800000Default stack size: 8388608 bytes: c# R: O2 i% a" g7 f4 h( r) o: h) U
    除了獲取棧的起始地址和大小外,還可以使用以下函數(shù)單獨獲取或設置棧的大小或起始地址:
    : p- T8 ~8 z/ m1 Y  O( L
  • pthread_attr_setstacksize():設置棧大小。
  • pthread_attr_getstacksize():獲取棧大小。
  • pthread_attr_setstackaddr():設置棧起始地址。
  • pthread_attr_getstackaddr():獲取棧起始地址。; x; D: h; C  X  S, j) d9 k( A
    2 L# y: k* H- w7 |8 E( X
    例如,如果你只想設置棧的大小而不需要改變棧的起始地址,可以使用 pthread_attr_setstacksize():
    6 i; F1 e6 d: G2 N; b7 ^" c: V  m0 i- v9 R/ y& R1 z9 K+ I) [
  • int main() {    pthread_attr_t attr;    size_t stacksize = 16 * 1024 * 1024;  // 設置棧大小為 16 MB" J' N8 i* F7 Z  N  h! V3 P) y
        // 初始化線程屬性    pthread_attr_init(&attr);  Q; M/ G  I' \
        // 設置棧大小    pthread_attr_setstacksize(&attr, stacksize);& T* c& |. T7 T4 t0 h) t+ k; O* L# `
        // 獲取并打印新的棧大小    pthread_attr_getstacksize(&attr, &stacksize);    printf("New stack size: %zu bytes
    $ Y: I7 u- `5 w2 Y", stacksize);& }- \, @: F6 `
        // 銷毀線程屬性對象    pthread_attr_destroy(&attr);% ?3 Y' c( X3 Z& w" v
        return 0;}
    1 E* }" ~* o' F3 x1 _, S3 C注意事項:
  • 棧大小不能小于系統(tǒng)允許的最小棧大小,可以通過 PTHREAD_STACK_MIN 宏獲得最小值。
  • 手動設置棧地址時,需要確保傳遞的內(nèi)存塊有效且大小合適。$ `8 D: X& ?% `- e! M4 |) J2 @
    [/ol]
    . O' Z$ I* f. n8 G, }6 G; o通過 pthread_attr_getstack() 和 pthread_attr_setstack() 函數(shù),可以方便地獲取和設置線程的棧起始地址和棧大小。
    . P3 S+ j5 V/ Y$ x4 Y% @( \4 s7 Z$ {1 U; u  [2 U' A
    對于需要自定義線程棧的應用程序,合理地管理棧空間可以提高程序的穩(wěn)定性和性能。
    . R; u! Z( I" `# e; v! M( N  s
    5 j( K: U/ c" H* H8 m在多線程編程中,了解和控制線程的棧使用情況對于高效的內(nèi)存管理和避免棧溢出至關重要。
    + I5 U) A& V$ |- K
    : |7 E& M& I- T8 _
    1 A/ J& I6 T2 a& M& l1 V8 F7 x點擊閱讀原文,更精彩~
  • 回復

    使用道具 舉報

    發(fā)表回復

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

    本版積分規(guī)則


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