溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

使用C語(yǔ)言怎么對(duì)線程對(duì)象和線程進(jìn)行存儲(chǔ)

發(fā)布時(shí)間:2021-03-09 15:13:29 來(lái)源:億速云 閱讀:199 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

使用C語(yǔ)言怎么對(duì)線程對(duì)象和線程進(jìn)行存儲(chǔ)?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

C語(yǔ)言是什么

C語(yǔ)言是一門(mén)面向過(guò)程的、抽象化的通用程序設(shè)計(jì)語(yǔ)言,廣泛應(yīng)用于底層開(kāi)發(fā),使用C語(yǔ)言可以以簡(jiǎn)易的方式編譯、處理低級(jí)存儲(chǔ)器。

使用線程對(duì)象

線程對(duì)象是在聲明中包含新存儲(chǔ)類(lèi)修飾符 _Thread_local 的全局或靜態(tài)對(duì)象。這意味著:每一個(gè)線程擁有屬于自己的線程對(duì)象實(shí)例,它在線程啟動(dòng)時(shí)創(chuàng)建并初始化。對(duì)象的存儲(chǔ)周期等于線程的運(yùn)行時(shí)間。在一個(gè)線程內(nèi)表達(dá)式里面的線程對(duì)象名,將引用這個(gè)對(duì)象在當(dāng)前線程下的本地實(shí)例。

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

【例1】使用一個(gè)線程對(duì)象

#include <stdio.h>
#include <threads.h>
thread_local int var = 10;
void print_var(void){ printf("var = %d\n", var); }
int func(void *);        // 線程函數(shù)
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)       // 線程函數(shù)
{
  var += 10;         // 線程本地變量
  print_var();        // 輸出:var = 20
  return 0
}

使用線程存儲(chǔ)

線程存儲(chǔ)技術(shù)要比線程對(duì)象更加靈活。例如,獨(dú)立線程可以使用不同大小的內(nèi)存。它們可以動(dòng)態(tài)地分配內(nèi)存,并通過(guò)調(diào)用析構(gòu)函數(shù)再次釋放內(nèi)存。同時(shí),可以使用相同的標(biāo)識(shí)符訪問(wèn)這些獨(dú)立線程所在的不同內(nèi)存區(qū)域。

這種靈活性通過(guò)初始創(chuàng)建一個(gè)全局的鍵(key)實(shí)現(xiàn),該鍵表示了一個(gè)指向線程存儲(chǔ)的指針。然后,獨(dú)立線程通過(guò)指定其線程存儲(chǔ)的位置加載這個(gè)指針。該全局鍵值是類(lèi)型為 tss_t 的對(duì)象。頭文件 threads.h 包含了該類(lèi)型的定義以及 4 個(gè)用于管理線程存儲(chǔ)(簡(jiǎn)稱(chēng) TSS)函數(shù)的聲明:

int tss_create(tss_t*key,tss_dtor_t dtor);

通過(guò)析構(gòu)函數(shù) dtor 生成一個(gè)新的 TSS 指針,并且將 key 引用的對(duì)象設(shè)置為唯一標(biāo)識(shí)該 TSS 指針的值。類(lèi)型 tss_dtor_t 是一個(gè)函數(shù)指針,定義為 void(*)(void*)(它指的是一個(gè)函數(shù)指針,該函數(shù)參數(shù)為 void 指針,并且該函數(shù)沒(méi)有返回值)。dtor 的返回值可以是一個(gè)空指針。

void tss_delete(tss_t key);

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

int tss_set(tss_t key,void*val);

對(duì)于調(diào)用 tss_set()的線程,將 key 所標(biāo)識(shí)的 TSS 指針設(shè)置為 val 所引用的內(nèi)存地址。

void*tss_get(tss_t key);

返回指向內(nèi)存塊的指針,該內(nèi)存塊為正在調(diào)用的線程通過(guò)函數(shù) tss_set()設(shè)置。如果發(fā)生錯(cuò)誤,tss_get()返回 NULL。

如果函數(shù) tss_create()和 tss_set()發(fā)生錯(cuò)誤,則返回 thrd_error;否則,返回 thrd_success。

例 2 中的程序在動(dòng)態(tài)分配的線程存儲(chǔ)中,保留線程的名稱(chēng)。

【例2】使用線程存儲(chǔ)

#include <threads.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
tss_t key;               // 用于TSS指針的全局鍵
int thFunc(void *arg);     // 線程函數(shù)
void destructor(void *data);  // 析構(gòu)函數(shù)
int main(void)
{
  thrd_t th2, th3;
  int result1 = 0, result2 = 0;
  // 創(chuàng)建一個(gè)TSS密鑰
  if (tss_create(&key, destructor) != thrd_success)
   return -1;
  // 創(chuàng)建線程
  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指針?biāo)械馁Y源
  return 0;
}
void print(void)        // 顯示線程存儲(chǔ)
{
 printf( "print: %s\n", (char*)tss_get(key) );
}
int thFunc( void *arg )
{
  char *name = (char*)arg;
  size_t size = strlen(name)+1;
  // 設(shè)置線程存儲(chǔ)
  if ( tss_set(key, malloc(size)) != thrd_success )
   return -1;
  // 存儲(chǔ)數(shù)據(jù)
  strcpy((char*)tss_get(key), name);
  print();
  return 0;
}
void destructor(void *data)
{
 printf("Destructor for %s\n", (char*)data);
 free(data);      // 釋放內(nèi)存
}

關(guān)于使用C語(yǔ)言怎么對(duì)線程對(duì)象和線程進(jìn)行存儲(chǔ)問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI