使用線程本地存儲

線程本地存儲(TLS)使同一進程的多個線程能夠使用由TlsAlloc函數分配的索引來存儲和檢索線程本地的值。在此示例中,在進程啟動時分配索引。當每個線程啟動時,它會分配一個動態內存塊,并使用TlsSetValue函數在TLS槽中存儲指向此內存的指針。CommonFunc函數使用TlsGetValue函數來訪問與調用線程本地的索引相關聯的數據。在每個線程終止之前,它會釋放其動態內存。在進程終止之前,它會調用TlsFree來釋放索引。

#include <windows.h> 
#include <stdio.h> #define THREADCOUNT 4 
DWORD dwTlsIndex; VOID ErrorExit(LPSTR); VOID CommonFunc(VOID) 
{ LPVOID lpvData; // Retrieve a data pointer for the current thread. lpvData = TlsGetValue(dwTlsIndex); if ((lpvData == 0) && (GetLastError() != ERROR_SUCCESS)) ErrorExit("TlsGetValue error"); // Use the data stored for the current thread. printf("common: thread %d: lpvData=%lx\n", GetCurrentThreadId(), lpvData); Sleep(5000); 
} DWORD WINAPI ThreadFunc(VOID) 
{ LPVOID lpvData; // Initialize the TLS index for this thread. lpvData = (LPVOID) LocalAlloc(LPTR, 256); if (! TlsSetValue(dwTlsIndex, lpvData)) ErrorExit("TlsSetValue error"); printf("thread %d: lpvData=%lx\n", GetCurrentThreadId(), lpvData); CommonFunc(); // Release the dynamic memory before the thread returns. lpvData = TlsGetValue(dwTlsIndex); if (lpvData != 0) LocalFree((HLOCAL) lpvData); return 0; 
} int main(VOID) 
{ DWORD IDThread; HANDLE hThread[THREADCOUNT]; int i; // Allocate a TLS index. if ((dwTlsIndex = TlsAlloc()) == TLS_OUT_OF_INDEXES) ErrorExit("TlsAlloc failed"); // Create multiple threads. for (i = 0; i < THREADCOUNT; i++) { hThread[i] = CreateThread(NULL, // default security attributes 0,                           // use default stack size (LPTHREAD_START_ROUTINE) ThreadFunc, // thread function NULL,                    // no thread function argument 0,                       // use default creation flags &IDThread);              // returns thread identifier // Check the return value for success. if (hThread[i] == NULL) ErrorExit("CreateThread error\n"); } for (i = 0; i < THREADCOUNT; i++) WaitForSingleObject(hThread[i], INFINITE); TlsFree(dwTlsIndex);return 0; 
} VOID ErrorExit (LPSTR lpszMessage) 
{ fprintf(stderr, "%s\n", lpszMessage); ExitProcess(0); 
}

相關話題

在動態鏈接庫中使用線程本地存儲

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

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

相關文章

發動機的工作原理,你知道嗎?

http://auto.jxedt.com/info/5352.htm 發動機是汽車的動力裝置&#xff0c;性能優劣直接影響到汽車性能&#xff0c;發動機的類型很多&#xff0c;結構各異&#xff0c;以適應不同車型的需要。按發動機使用燃料劃分&#xff0c;可分成汽油發動機和柴油發動機等類別。按發動機汽…

官方文檔: Dubbo 框架設計、模塊說明、依賴關系

以下內容全文轉自 apache 官方 dubbo文檔&#xff1a;http://dubbo.apache.org/en-us/docs/dev/design.html 框架設計 圖片描述&#xff1a; 淺藍色背景的左側區域顯示服務用戶界面&#xff0c;淺綠色背景的右側區域顯示服務提供者界面&#xff0c;中心區域顯示兩個側面界面。…

那些花兒

今天上海下雨了&#xff0c;心緒也變得低落&#xff0c;突然很想念宿舍的姐妹。畢業后就自作聰明地和她們失去了聯系&#xff0c;今天去QQ群遛了一圈。虹結婚了&#xff0c;敏還是活得那么瀟灑&#xff0c;笑也在努力地生活... 人生啊&#xff01;總是在向前走&#xff0c;遇…

CreateRemoteThread函數

CreateRemoteThread函數 創建在另一個進程的虛擬地址空間中運行的線程。 使用CreateRemoteThreadEx函數創建在另一個進程的虛擬地址空間中運行的線程&#xff0c;并可選擇指定擴展屬性。 語法 HANDLE CreateRemoteThread(HANDLE hProcess,LPSECURITY_ATTRI…

防火墻問題 Linux系統 /etc/sysconfig/路徑下無iptables文件

虛擬機新裝了一個CentOs7&#xff0c;然后做防火墻配置的時候找不到iptables文件&#xff0c;解決方法如下&#xff1a; 因為默認使用的是firewall作為防火墻&#xff0c;把他停掉裝個iptable systemctl stop firewalld systemctl mask firewalld yum install -y iptables yum …

如果風 知道 ... 如果云 知道 ...

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 //《心靈之音》----- Bandari 來自酷狗。 一直很喜歡聽歌&#xff1a; 喜歡默默的聽、一個人安安靜靜的聽、長長久久的聽、聽得忘乎所…

切記!這樣洗頭最傷身

各種的忙碌已經成為了現代人生活中的一個標志&#xff0c;每天的加班&#xff0c;玩樂到深夜&#xff0c;游戲等&#xff0c;都讓不少的人的洗澡時間都只能在臨睡前&#xff0c;而女人洗頭也只能在晚上臨睡之前洗。如果可以有足夠的時間&#xff0c;等待頭發完全干透了之后&…

可以供MFC調用的,QT實現的DLL(qtwinmigrate實現)

MFC和QT的消息循環機制不同&#xff0c;所以&#xff0c;要讓QT寫的DLL可以供MFC調用&#xff0c;要做一點特殊的處理 #include <qmfcapp.h> #include <qwinwidget.h> #include <QtGui>#include <QtGui/QMessageBox> #include <windows.h> #incl…

離合器的操作技巧

學車其實不難&#xff0c;學車最基本的幾個操作&#xff0c;打方向盤、踩離合、踩剎車、換檔位都是學員需要必學的基本操作&#xff0c;在網絡駕校上有學員反應&#xff0c;對離合器的操作比較難&#xff0c;經常錯誤操作造成熄火等現象&#xff0c;現在瀘州駕校論壇小編整理了…

Linux 上 安裝 nginx、 阿里云服務器上安裝 nginx

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Docker 方式安裝見另一文&#xff1a;Docker 方式安裝 Nginx 、阿里云服務器上裝 Ngnix 1. gcc 安裝 安裝 nginx 需要先將官網下載的源…

CSDN-markdown編輯器使用說明

歡迎使用Markdown編輯器 你好&#xff01; 這是你第一次使用 Markdown編輯器 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章&#xff0c;了解一下Markdown的基本語法知識。 新的改變 我們對Markdown編輯器進行了一些功能拓展與語法支持&#x…

本地Android源代碼庫下載源碼

1. 安裝repo 新建放置repo的bin目錄 $ mkdir ~/bin $ echo "export PATH~/bin:\$PATH" >> ~/.bashrc$ source ~/.bashrc 獲取repo并賦予可執行權限&#xff08;或者參考google官方網站&#xff09; $ curl https://storage.googleapis.com/git-repo-downloads/…

解決: Spring Boot報錯 This application has no explicit mapping ... a fallback

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 啟動spring boot然后訪問頁面的時候&#xff0c;出現如下錯誤&#xff1a; Whitelabel Error PageThis application has no explicit m…

三種錢非常奧妙 花越多就賺越多

世界上有三種錢非常奧妙&#xff0c;你花得越多就賺得越多。這是學校老師不會教的事&#xff0c;讓我們看看&#xff1a; 第一種錢&#xff1a;投資自己&#xff0c;自我成長&#xff0c;學習的錢一定要花&#xff01; 如果我們把世界首富比爾.蓋茨從美國抓到非洲&#xff0c…

#pragma once 與 #ifndef比較分析

為了避免同一個文件被include多次&#xff0c;C/C中有兩種方式&#xff0c;一種是#ifndef方式&#xff0c;一種是#pragma once方式。在能夠支持這兩種方式的編譯器上&#xff0c;二者并沒有太大的區別&#xff0c;但是兩者仍然還是有一些細微的區別。 方式一&#xff1a; #ifn…

中醫:看腳十秒鐘可知身體疾病

中醫認為&#xff0c;自測疾病有很多方法&#xff0c;如通過身體部位可自測疾病&#xff0c;還可通過疼痛自測疾病等等。在這里&#xff0c;我們主要講如何通過腳自測疾病。也許&#xff0c;許多人不太在意自己的腳部&#xff0c;是最不受“照顧”的一個身體部位。然而&#xf…

Springcloud 引導上下文

SpringCloud為我們提供了bootstrap.properties的屬性文件&#xff0c;我們可以在該屬性文件里做我們的服務配置。可是&#xff0c;我們知道SpringBoot已經為我們提供了做服務配置的屬性文件application.properties&#xff0c;那么這兩個配置文件有什么區別呢&#xff1f;在Spr…

Springboot 項目中過濾器的使用

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 編寫過濾器類&#xff1a; package gentle;import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.se…

C++ 中 new 操作符內幕:new operator、operator new、placement new

一、new 操作符&#xff08;new operator&#xff09; 人們有時好像喜歡有意使C語言的術語難以理解。比方說new操作符&#xff08;new operator&#xff09;和operator new的差別。 當你寫這種代碼&#xff1a; string *ps new string("Memory Management");你使…

Flask-1-05-CookieSession

接下來我會演示一下設置Cookie 讀取Cookie 刪除Cookie&#xff0c;以及添加Cookie的原理 接下來我們分別定義3個視圖為 set_cookie、get_cookie、del_cookie # coding:utf-8from flask import Flask, make_response, requestapp Flask(__name__)app.route("/set_cookie&q…