中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用C語言怎么對線程對象和線程進行存儲

發布時間:2021-03-09 15:13:29 來源:億速云 閱讀:199 作者:Leah 欄目:開發技術

使用C語言怎么對線程對象和線程進行存儲?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

C語言是什么

C語言是一門面向過程的、抽象化的通用程序設計語言,廣泛應用于底層開發,使用C語言可以以簡易的方式編譯、處理低級存儲器。

使用線程對象

線程對象是在聲明中包含新存儲類修飾符 _Thread_local 的全局或靜態對象。這意味著:每一個線程擁有屬于自己的線程對象實例,它在線程啟動時創建并初始化。對象的存儲周期等于線程的運行時間。在一個線程內表達式里面的線程對象名,將引用這個對象在當前線程下的本地實例。

修飾符 _Thread_local 可以與修飾符 static 或 extern 同時使用。頭文件 threads.h 定義了 thread_local 作為 _Thread_local 的同義詞。在例 1 中,主線程和新啟動線程各自擁有線程本地變量 var 的一個實例。

【例1】使用一個線程對象

#include <stdio.h>
#include <threads.h>
thread_local int var = 10;
void print_var(void){ printf("var = %d\n", var); }
int func(void *);        // 線程函數
int main(int argc, char *argv[])
{
  thrd_t th2;
  if ( thrd_create( &th2, func, NULL ) != thrd_success ){
   fprintf(stderr,"Error creating thread.\n"); return 0xff;
  }
  print_var();        // 輸出:var = 10
  thrd_join(th2, NULL);
  return 0;
}
int func(void *arg)       // 線程函數
{
  var += 10;         // 線程本地變量
  print_var();        // 輸出:var = 20
  return 0
}

使用線程存儲

線程存儲技術要比線程對象更加靈活。例如,獨立線程可以使用不同大小的內存。它們可以動態地分配內存,并通過調用析構函數再次釋放內存。同時,可以使用相同的標識符訪問這些獨立線程所在的不同內存區域。

這種靈活性通過初始創建一個全局的鍵(key)實現,該鍵表示了一個指向線程存儲的指針。然后,獨立線程通過指定其線程存儲的位置加載這個指針。該全局鍵值是類型為 tss_t 的對象。頭文件 threads.h 包含了該類型的定義以及 4 個用于管理線程存儲(簡稱 TSS)函數的聲明:

int tss_create(tss_t*key,tss_dtor_t dtor);

通過析構函數 dtor 生成一個新的 TSS 指針,并且將 key 引用的對象設置為唯一標識該 TSS 指針的值。類型 tss_dtor_t 是一個函數指針,定義為 void(*)(void*)(它指的是一個函數指針,該函數參數為 void 指針,并且該函數沒有返回值)。dtor 的返回值可以是一個空指針。

void tss_delete(tss_t key);

釋放 TSS 鍵 key 所使用的所有資源。

int tss_set(tss_t key,void*val);

對于調用 tss_set()的線程,將 key 所標識的 TSS 指針設置為 val 所引用的內存地址。

void*tss_get(tss_t key);

返回指向內存塊的指針,該內存塊為正在調用的線程通過函數 tss_set()設置。如果發生錯誤,tss_get()返回 NULL。

如果函數 tss_create()和 tss_set()發生錯誤,則返回 thrd_error;否則,返回 thrd_success。

例 2 中的程序在動態分配的線程存儲中,保留線程的名稱。

【例2】使用線程存儲

#include <threads.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
tss_t key;               // 用于TSS指針的全局鍵
int thFunc(void *arg);     // 線程函數
void destructor(void *data);  // 析構函數
int main(void)
{
  thrd_t th2, th3;
  int result1 = 0, result2 = 0;
  // 創建一個TSS密鑰
  if (tss_create(&key, destructor) != thrd_success)
   return -1;
  // 創建線程
  if (thrd_create(&th2, thFunc, "Thread_1") != thrd_success
     || thrd_create(&th3, thFunc, "Thread_2") != thrd_success)
    return -2;
  thrd_join(th2, &result1); thrd_join(th3, &result2);
  if ( result1 != 0 || result2 != 0 )
    fputs("Thread error\n", stderr);
  else
    puts("Threads finished without error.");
  tss_delete(key);      // 釋放TSS指針所有的資源
  return 0;
}
void print(void)        // 顯示線程存儲
{
 printf( "print: %s\n", (char*)tss_get(key) );
}
int thFunc( void *arg )
{
  char *name = (char*)arg;
  size_t size = strlen(name)+1;
  // 設置線程存儲
  if ( tss_set(key, malloc(size)) != thrd_success )
   return -1;
  // 存儲數據
  strcpy((char*)tss_get(key), name);
  print();
  return 0;
}
void destructor(void *data)
{
 printf("Destructor for %s\n", (char*)data);
 free(data);      // 釋放內存
}

關于使用C語言怎么對線程對象和線程進行存儲問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

英超| 英吉沙县| 威远县| 克山县| 襄汾县| 东平县| 高平市| 汤阴县| 普陀区| 天全县| 和政县| 盐边县| 广元市| 莒南县| 南投市| 漳州市| 哈巴河县| 苍溪县| 通河县| 盐源县| 东山县| 华坪县| 额尔古纳市| 龙川县| 临夏县| 平乡县| 武汉市| 景洪市| 区。| 保亭| 阳原县| 稷山县| 安新县| 隆尧县| 铜山县| 界首市| 安达市| 襄汾县| 澳门| 双流县| 重庆市|