Linux C語言程序中線程本地存儲變量的內存分配和使用

在多線程中,有一種叫線程本地存儲(Thread-Local Storage,TLS)的變量,它是每個線程有且只有一份自己的副本,對于這個線程來說,它是全局變量,可被所有函數共用;因為每個線程都有自己的一份內存來存儲這些變量,所以線程之間不會相互干擾。

TLS變量的內存分配和釋放是由操作系統自動管理的,程序員無需手動分配和釋放內存。同時,由于每個線程都有自己獨立的一份副本,因此TLS變量的讀寫不需要加鎖,可以提高多線程程序的性能。

Linux C語言程序中聲明這種類型的變量舉例如下:

static __thread int buf[max];

內存分配時機

  • 線程啟動時: 當一個線程啟動時,為該線程分配的線程局部存儲 (TLS) 空間中會包含該線程的 static __thread 變量的內存空間。每個線程都有自己的 TLS 空間,因此每個線程的 static __thread 變量都有自己的獨立副本。主線程的TLS變量是在main函數運行之前被分配,其它線程的TLS則是在線程被創建時分配。

When a program is started, the operating system creates a new process, and the C runtime library (CRT) initializes the program's memory. As part of this initialization, the CRT allocates memory for all static variables, including static __thread variables.

When a new thread is created, the CRT allocates a new block of memory for the thread's stack, and initializes the __thread variables in that block.

The static keyword ensures that the variable is initialized only once

  • 首次訪問變量時: 如果在多線程環境中,某個線程首次訪問一個 static __thread 變量,則會在該線程的 TLS 空間中分配該變量的內存空間。此后,該線程后續對該變量的訪問都將使用該分配的內存空間。

內存分配的時機取決于以下因素

  • 編譯器: 不同的編譯器可能會對 static __thread 變量的內存分配方式略有不同。例如,GNU Compiler Collection (GCC) 通常會在線程啟動時分配內存,而 Intel Compiler (ICC) 則可能在首次訪問變量時分配內存。
  • 操作系統版本: 不同的操作系統版本可能對 TLS 的實現有所不同,這可能會影響 static __thread 變量的內存分配方式。
  • 如果 static __thread 變量在聲明時被初始化,例如 static __thread int tls_var = 42; 那么它的內存將在程序啟動時被分配,并在程序結束時被釋放。如果 static __thread 變量在聲明時沒有被初始化,那么它的內存將在第一次被訪問時被分配,并在線程結束時被釋放。例如:
static __thread int tls_var;void set_tls_var() { tls_var = 42; }

TLS 變量在內存中的位置和限制

  • 通常是在棧上分配的,而不是在堆上分配的。這是因為 TLS 空間通常位于線程的棧中。
  • 內存大小是固定的。
  • 內存是線程私有的,但因為只要是內存就有地址,可以通過獲取TLS變量的地址實現線程外的訪問和操作。
  • TLS變量的數量和總大小可能受到系統限制。
  • 過多或過大的TLS變量可能會影響程序的性能和資源使用。
#include <stdio.h>
#include <pthread.h>static __thread int tls_var = 0;  // TLS變量聲明void* thread_function(void* arg) {printf("Thread %ld: TLS var initial value = %d\n", (long)pthread_self(), tls_var);tls_var = 42;  // 修改TLS變量printf("Thread %ld: TLS var new value = %d\n", (long)pthread_self(), tls_var);return NULL;
}int main() {pthread_t thread1, thread2;pthread_create(&thread1, NULL, thread_function, NULL);pthread_create(&thread2, NULL, thread_function, NULL);pthread_join(thread1, NULL);pthread_join(thread2, NULL);return 0;
}

作者寄語

以上如有錯漏之處,敬請大家指正。我是主修C/C++、Vue3,開發網站的程序員,我的聯系方式:
微信:TobeBuda
Email/Paypal: jinmin.si@outlook.com
邀請您加入「社區資訊服務」創業微信群,共同探討打造社區資訊服務的美好未來。

參考資料

gemini

mistral

claude

llama

chatgpt

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/35617.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35617.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/35617.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

單機、集群和分布式

目錄 1.概述 2.單機服務器 單機版的服務器的性能&#xff0c;設計上的瓶頸&#xff1f; 3.集群 解決瓶頸1&#xff1a; 沒有解決瓶頸2&#xff1a; 沒有解決瓶頸3&#xff1a; 集群的優點&#xff1f; 集群的缺點&#xff1f; 4.分布式 分布式的優點&#xff1f; 分…

c++筆記提高效率-emplace函數

在C中&#xff0c;標準庫容器的emplace方法是一種高效的插入操作&#xff0c;用于在容器中直接構造元素。與insert和push方法相比&#xff0c;emplace方法可以避免不必要的復制或移動操作&#xff0c;因為它直接在容器內部構造元素。下面詳細介紹各容器的emplace方法及其用法。…

java常用類(2)

目錄 1.String概述 1.1 字符串的不變性 1.2 創建String對象兩種方式的區別 1.3 字符串中的構造方法 1.4 字符串判斷功能的方法 1.5 字符串獲取功能的方法 1.6 字符串轉換功能的方法 1.7 字符串替換功能的方法 2.StringBuffer 2.1 構造方法 2.2 插入方法 2.2.1 app…

a-table單元格指定合并以及表格雙擊編輯以及未填寫指定驗證功能

文章目錄 a-table單元格指定合并以及表格雙擊編輯以及未填寫指定驗證功能一、 a-table單元格指定合并1. a-table2. columns3. 圖例 二、a-table 表格雙擊編輯以及未填寫驗證1. a-table2. js3. 圖例 a-table單元格指定合并以及表格雙擊編輯以及未填寫指定驗證功能 一、 a-table…

從零開始精通Onvif之加密與認證

&#x1f4a1; 如果想閱讀最新的文章&#xff0c;或者有技術問題需要交流和溝通&#xff0c;可搜索并關注微信公眾號“希望睿智”。 概述 安全是Onvif規范的核心部分&#xff0c;它涵蓋了加密和認證兩大領域。在Onvif標準下&#xff0c;安全措施主要包括&#xff1a;設備訪問控…

大模型AI技術實現語言規范練習

人工智能技術可以為語言規范練習提供多種有效的解決方案&#xff0c;幫助學習者更有效地掌握語言規范。以下是一些常見的應用場景。北京木奇移動技術有限公司&#xff0c;專業的軟件外包開發公司&#xff0c;歡迎交流合作。 1. 智能糾錯 利用自然語言處理技術&#xff0c;可以…

DC/AC電源模塊一種效率與可靠性兼備的能源轉換解決方案

DC/AC電源模塊都是一種效率與可靠性兼備的能源轉換解決方案 DC/AC電源模塊是一種能夠將直流電源&#xff08;DC&#xff09;轉換為交流電源&#xff08;AC&#xff09;的設備。它在現代電子設備中扮演著非常重要的角色&#xff0c;因為許多設備需要交流電源才能正常運行。無論…

樹形結構的勾選、取消勾選、刪除、清空已選、回顯、禁用

樹形結構的勾選、取消勾選、刪除、清空已選、回顯、禁用 基本頁面&#xff1a; 分為上傳文件和編輯的頁面 代碼實現要點&#xff1a; 上傳文件頁面&#xff1a; 點開選擇范圍彈窗&#xff0c;三個radio單選框都為可選狀態&#xff0c;默認顯示的是第一個單選框&#xff08;按…

開源C++版AI畫圖大模型框架stable-diffusion.cpp開發使用初體驗

stable-diffusion.cpp是一個C編寫的輕量級開源類AIGC大模型框架&#xff0c;可以支持在消費級普通設備上本地部署運行大模型進行AI畫圖&#xff0c;以及作為依賴庫集成的到應用程序中提供類似于網頁版stable-diffusion的功能。 以下基于stable-diffusion.cpp的源碼利用C api來…

人工智能的未來:暢想智能新時代

人工智能正在改變我們的世界&#xff0c;它將帶我們走向何方&#xff1f; 著名神經科學家、Numenta 公司創始人杰夫?霍金斯 Jeff Hawkins 在其著作《人工智能的未來》中&#xff0c;描繪了一幅人工智能發展的光明圖景。他認為&#xff0c;人工智能將超越人類智能&#xff0c;…

理解Gobrs-Async相對于CompletableFuture的優勢

Gobrs-Async框架針對復雜應用場景下的異步任務編排&#xff0c;提供了一些傳統Future或CompletableFuture所不具備的特性和能力&#xff0c;以下是它能夠解決的問題和相對于CompletableFuture的優勢&#xff1a; 1. **全鏈路異常回調**&#xff1a; - Gobrs-Async允許為任務…

關于地圖點擊的操作

_this.map.dragging.disable(); //地圖拖拽 _this.map.doubleClickZoom.disable(); //禁止雙擊放大地圖 _this.map.scrollWheelZoom.disable(); //禁止鼠標滑輪滾動放大縮小地圖 _this.map.dragging.enable(); //e…

備份和鏡像TrinityCore

相比重新安裝&#xff0c;省去了編譯的過程&#xff0c;同時還能保留以前的人物、裝備等。 注意&#xff0c;若不想重新編譯安裝&#xff0c;則需要創建一樣的目錄、賬戶等&#xff0c;以減少不必要的麻煩。 首先備份數據: mysql備份和導入方法見&#xff1a;使用dump備份my…

視覺與味蕾的交響:紅酒與藝術的無界狂歡,震撼你的感官世界

在浩瀚的藝術海洋中&#xff0c;紅酒以其不同的魅力&#xff0c;成為了一種跨界整合的媒介。當雷盛紅酒與藝術相遇&#xff0c;它們共同呈現出一場特別的視覺盛宴&#xff0c;讓人沉醉在色彩與光影的交織中&#xff0c;感受紅酒與藝術的無界碰撞。 雷盛紅酒&#xff0c;宛如一件…

AI作畫Prompt不會寫?Amazon Bedrock Claude3.5來幫忙

最新上線的Claude3.5 Sonnet按照官方介紹的數據來看&#xff0c;在多方面超越了CPT-4o&#xff0c;是迄今為止最智能的模型。 而跟上一個版本相比&#xff0c;速度是Claude 3 Opus的兩倍&#xff0c;成本只有其五分之一。 Claude3.5 Sonnet不僅擅長解釋圖表、圖形或者從不完…

vue3中子組件調用父組件事件

在 Vue 3 中&#xff0c;子組件調用父組件的事件&#xff08;或方法&#xff09;的方式與 Vue 2 類似&#xff0c;但 Vue 3 引入了 Composition API&#xff0c;這可能會改變你組織代碼的方式。不過&#xff0c;基本的通信機制——通過自定義事件 ($emit) 通知父組件——仍然保…

總結:DataX

一、介紹 本文主要介紹DataX的安裝與使用。 二、安裝 安裝&#xff1a;DataX/userGuid.md at master alibaba/DataX GitHub 六、案例 實現從MySQL同步數據到HDFS&#xff0c;然后使用Hive進行聚合計算并將結果存儲回MySQL。 步驟2&#xff1a;使用DataX同步MySQL數據到H…

Day28:回溯法 491.遞增子序列 46.全排列 47.全排列 II 332.重新安排行程 51. N皇后 37. 解數獨

491. 非遞減子序列 給你一個整數數組 nums &#xff0c;找出并返回所有該數組中不同的遞增子序列&#xff0c;遞增子序列中 至少有兩個元素 。你可以按 任意順序 返回答案。 數組中可能含有重復元素&#xff0c;如出現兩個整數相等&#xff0c;也可以視作遞增序列的一種特殊情…

Atcoder ABC359E Water Tank 題解

題目傳送門 題解 分析 分類討論。 記第 i i i 個答案為 a n s i 1 ans_i1 ansi?1。 第 i i i 個數就是目前的最大值。 顯然&#xff0c; a n s i h i i ans_ih_i \times i ansi?hi?i。第 i i i 個數就是目前的最大值。 記 l a s t i last_i lasti? 為 i i i …

網絡安全學習路線圖(2024版詳解)

近期&#xff0c;大家在網上對于網絡安全討論比較多&#xff0c;想要學習的人也不少&#xff0c;但是需要學習哪些內容&#xff0c;按照什么順序去學習呢&#xff1f;其實我們已經出國多版本的網絡安全學習路線圖&#xff0c;一直以來效果也比較不錯&#xff0c;本次我們針對市…