亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言線程對象和線程存儲的實現(xiàn)

 更新時間:2021年03月09日 11:28:10   投稿:zx  
這篇文章主要介紹了C語言線程對象和線程存儲的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

當每個線程為各自的變量使用全局標識符時,為保留這些變量各自的數(shù)據(jù),可以采用線程對象(thread-local object)和線程存儲(thread-specific storage)。

這兩項技術允許在一個給定線程中執(zhí)行的函數(shù)可以共享數(shù)據(jù)而不造成沖突,即便當其他線程也在執(zhí)行同樣函數(shù)的情況下。

使用線程對象

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

修飾符 _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 *);        // 線程函數(shù)
int main(int argc, char *argv[])
{
  thrd_t th1;
  if ( thrd_create( &th1, func, NULL ) != thrd_success ){
   fprintf(stderr,"Error creating thread.\n"); return 0xff;
  }
  print_var();        // 輸出:var = 10
  thrd_join(th1, NULL);
  return 0;
}
int func(void *arg)       // 線程函數(shù)
{
  var += 10;         // 線程本地變量
  print_var();        // 輸出:var = 20
  return 0
}

使用線程存儲

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

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

int tss_create(tss_t*key,tss_dtor_t dtor);

通過析構函數(shù) dtor 生成一個新的 TSS 指針,并且將 key 引用的對象設置為唯一標識該 TSS 指針的值。類型 tss_dtor_t 是一個函數(shù)指針,定義為 void(*)(void*)(它指的是一個函數(shù)指針,該函數(shù)參數(shù)為 void 指針,并且該函數(shù)沒有返回值)。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);

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

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

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

【例2】使用線程存儲

#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);  // 析構函數(shù)
int main(void)
{
  thrd_t th1, th2;
  int result1 = 0, result2 = 0;
  // 創(chuàng)建一個TSS密鑰
  if (tss_create(&key, destructor) != thrd_success)
   return -1;
  // 創(chuàng)建線程
  if (thrd_create(&th1, thFunc, "Thread_1") != thrd_success
     || thrd_create(&th2, thFunc, "Thread_2") != thrd_success)
    return -2;
  thrd_join(th1, &result1); thrd_join(th2, &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;
  // 存儲數(shù)據(jù)
  strcpy((char*)tss_get(key), name);
  print();
  return 0;
}
void destructor(void *data)
{
 printf("Destructor for %s\n", (char*)data);
 free(data);      // 釋放內存
}

到此這篇關于C語言線程對象和線程存儲的實現(xiàn)的文章就介紹到這了,更多相關C語言線程對象和線程存儲內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 基于QT實現(xiàn)自定義溫度計的示例代碼

    基于QT實現(xiàn)自定義溫度計的示例代碼

    QT原生控件沒有實現(xiàn)如儀表盤或者溫度計的控件,只好自己實現(xiàn),所以本文為大家介紹了如何利用qt實現(xiàn)自定義溫度/濕度控件,感興趣的小伙伴可以了解下
    2023-11-11
  • Qt利用QGraphicsView繪制跳舞的機器人

    Qt利用QGraphicsView繪制跳舞的機器人

    最近新學了一招秘密武器,打算分享給大家!那就是如何在QGraphicsView中制作一個跳舞的機器人,快跟隨小編一起動手嘗試一下吧
    2022-06-06
  • C++中的atoi?函數(shù)簡介

    C++中的atoi?函數(shù)簡介

    這篇文章主要給大家分享的是C++中的atoi?函數(shù)的簡單介紹,在?stdlib.h?中?atoi?函數(shù),可用于將?char?字符串轉為?int?整數(shù)類型,集體的語法操作請參考下面文章的詳細內容
    2021-11-11
  • C++應用實現(xiàn)簡易五子棋游戲

    C++應用實現(xiàn)簡易五子棋游戲

    這篇文章主要為大家詳細介紹了C++應用實現(xiàn)簡易五子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C語言堆棧入門指南

    C語言堆棧入門指南

    我身邊的一些編程的朋友以及在網(wǎng)上看帖遇到的朋友中有好多也說不清堆棧,所以我想有必要給大家分享一下我對堆棧的看法,有說的不對的地方請朋友們不吝賜教,這對于大家學習會有很大幫助
    2014-01-01
  • C和C++中argc和argv的含義及用法詳解

    C和C++中argc和argv的含義及用法詳解

    argv 是 argument vector的縮寫,表示傳入main函數(shù)的參數(shù)序列或指針,這篇文章主要介紹了C和C++中argc和argv的含義以及用法,需要的朋友可以參考下
    2022-11-11
  • C/C++實現(xiàn)推箱子小游戲

    C/C++實現(xiàn)推箱子小游戲

    這篇文章主要為大家詳細介紹了C/C++實現(xiàn)推箱子小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++ boost scoped_ptr智能指針詳解

    C++ boost scoped_ptr智能指針詳解

    智能指針是一種像指針的C++對象,但它能夠在對象不使用的時候自己銷毀掉。雖然STL提供了auto_ptr,但是由于不能同容器一起使用(不支持拷貝和賦值操作),因此很少有人使用。它是Boost各組件中,應用最為廣泛的一個
    2022-11-11
  • Qt中圖片旋轉縮放操作的實現(xiàn)

    Qt中圖片旋轉縮放操作的實現(xiàn)

    本文主要介紹了Qt中圖片旋轉縮放操作的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-01-01
  • opencv3/C++ 直方圖反向投影實例

    opencv3/C++ 直方圖反向投影實例

    今天小編就為大家分享一篇opencv3/C++ 直方圖反向投影實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12

最新評論