在記憶體理解上,最著名的例子就是執行緒啟動時的引數傳遞

2021-06-11 23:22:08 字數 802 閱讀 7456

在記憶體理解上,最著名的例子就是執行緒啟動時的引數傳遞。

函式啟動乙個執行緒,很多時候需要向執行緒傳引數,但是執行緒是非同步啟動的,即很可能啟動函式已經退出了,而執行緒函式都還沒有正式開始執行,因此,絕不能用啟動函式的內部變數給執行緒傳參。道理很簡單,函式的內部變數在浮動棧,但函式退出時,浮動棧自動拆除,記憶體空間已經被釋放了。當執行緒啟動時,按照給的引數指標去查詢變數,實際上是在讀一塊無效的記憶體區域,程式會因此而崩潰。

那怎麼辦呢?我們應該直接用malloc函式給需要傳遞的引數分配一塊記憶體區域,將指標傳入執行緒,執行緒收到後使用,最後執行緒退出時,free釋放。

我們來看例子:

//

這個結構體就是參數列

typedef struct _clisten_listenaccepttask_param_

sclistenaccepttaskparam;

//習慣性寫法,設定結構體後,立即宣告結構體的尺寸,為後續malloc提供方便

const ulong sclistenaccepttaskparamsize = sizeof(sclistenaccepttaskparam);

//這裡接收到連線請求,申請引數區域,將關鍵資訊帶入引數區域,幫助後續執行緒工作。

bool clisten::listentaskcallback(void* pcallparam,int&nstatus) //

這是執行緒函式,負責處理上文accept到的socket

bool clisten::listenaccepttask(void* pcallparam,int&nstatus)

自己的理解 堆,棧及變數在記憶體中的分布

參考文章 http www.cppblog.com oosky archive 2006 01 21 2958.html 下文部分是參考的,主要寫部落格,是為了更好的讓自己理解,鞏固知識點。日積月累。1.堆 由程式設計師自己申請和釋放 內部是不連續的鏈式結構。c語言中,malloc就是用來從堆中申請...

Golang與C 在記憶體分配機制上的不同

listtest.cpp 定義控制台應用程式的入口點。include stdafx.h include include class student void list transvers student head student inserthead student head printf inse...

浮點數在記憶體中的表示移位儲存難點的理解

我們知道,單精度浮點數,在記憶體中是使用32位儲存 那麼這8位組成的新的位元組,我們來用下面的一串數字 00000000 對的,實際上這個就是浮點數冪指數 階碼 的儲存空 首先,我們假設不使用移位儲存 就是大家最頭痛,最 00000000 開始,到 11111111 結束,也就是從0開始到255結束...