• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數據加載中……

            線程本地存儲 (TLS)

            線程本地存儲 (TLS) 是一個方法,通過該方法,給定的多線程進程中的每個線程都可以分配存儲線程特定數據的位置。通過 TLS API(TlsAlloc、TlsGetValue、TlsSetValue、TlsFree)方式支持動態(tài)綁定(運行時)的線程特定數據。除了現有的 API 實現,Win32 和 Visual C++ 編譯器現在還支持靜態(tài)綁定(加載時間)基于線程的數據。

            TLS 的 API 實現

            通過 Win32 API 層和編譯器實現“線程本地存儲”。有關詳細信息,請參見 Win32 API 文檔中的 TlsAlloc、TlsGetValue、TlsSetValue 和 TlsFree。

            Visual C++ 編譯器包括使線程本地存儲操作更加自動化的關鍵字,而不是通過 API 層。將在下一節(jié)(TLS 的編譯器實現)描述此語法。

            TLS 的編譯器實現

            為了支持 TLS,已將新屬性 thread 添加到了 C 和 C++ 語言,并由 Visual C++ 編譯器支持。此屬性是一個擴展存儲類修飾符,如上一節(jié)中所述。使用 __declspec 關鍵字聲明 thread 變量。例如,以下代碼聲明了一個整數線程局部變量,并用一個值對其進行初始化:

            __declspec( thread ) int tls_i = 1;

            TLS 的規(guī)則和限制

            聲明靜態(tài)綁定線程的本地對象和變量時必須遵守下列原則:

            • thread 屬性只能應用于數據聲明和定義。它不能用于函數聲明或定義。例如,以下代碼將生成一個編譯器錯誤:
              #define Thread  __declspec( thread )
              Thread void func();     // This will generate an error.
            • 只能在具有 static 作用域的數據項上指定 thread 修飾符。包括全局數據對象(包括 staticextern)、本地靜態(tài)對象和 C++ 類的靜態(tài)數據成員。不可以用 thread 屬性聲明自動數據對象。以下代碼將生成編譯器錯誤:
              #define Thread  __declspec( thread )
              void func1()
              {
                  Thread int tls_i;            // This will generate an error.
              }
              
              int func2( Thread int tls_i )    // This will generate an error.
              {
                  return tls_i;
              }
            • 線程本地對象的聲明和定義必須全都指定 thread 屬性。例如,以下代碼將生成錯誤:
              #define Thread  __declspec( thread )
              extern int tls_i;        // This will generate an error, since the
              int Thread tls_i;        // declaration and definition differ.
            • thread 屬性不能用作類型修飾符。例如,以下代碼將生成一個編譯器錯誤:
              char __declspec( thread ) *ch;        // Error
            • C++ 類不能使用 thread 屬性。但是,可以使用 thread 屬性將 C++ 類對象實例化。例如,以下代碼將生成一個編譯器錯誤:
              #define Thread  __declspec( thread )
              class Thread C       // Error: classes cannot be declared Thread.
              {
              // Code
              };
              C CObject;

              因為允許使用 thread 屬性的 C++ 對象的聲明,因此下面兩個示例在語義上是等效的:

              #define Thread  __declspec( thread )
              Thread class B
              {
              // Code
              } BObject;               // OK--BObject is declared thread local.
              
              class B
              {
              // Code
              };
              Thread B BObject;        // OK--BObject is declared thread local.
            • 不將線程本地對象的地址視為常數,并且涉及此類地址的任何表達式都不視為常數。在標準 C 中,這種作法的效果是禁止將線程本地變量的地址用作對象或指針的初始值設定項。例如,C 編譯器將以下代碼標記為錯誤:
              #define Thread  __declspec( thread )
              Thread int tls_i;
              int *p = &tls_i;       //This will generate an error in C.

              但是,此限制不適用于 C++。因為 C++ 允許動態(tài)初始化所有對象,因此可以用使用線程本地變量地址的表達式初始化對象。實現此操作的方式與實現線程本地對象結構的方式相同。例如,以上顯示的代碼在作為 C++ 源文件編譯時不會生成錯誤。請注意:只有在其中獲取地址的線程仍然存在的情況下,線程本地變量的地址才有效。

            • 標準 C 允許使用涉及引用自身的表達式初始化對象或變量,但只適用于非靜態(tài)作用域的對象。雖然 C++ 通常允許使用涉及引用自身的表達式動態(tài)初始化對象,但是這種類型的初始化不允許用于線程本地對象。例如:
              #define Thread  __declspec( thread )
              Thread int tls_i = tls_i;                // Error in C and C++ 
              int j = j;                               // OK in C++, error in C
              Thread int tls_i = sizeof( tls_i )       // Legal in C and C++

              請注意:包含正在初始化的對象的 sizeof 表達式不建立對自身的引用且在 C 和 C++ 中都是合法的。

              C++ 不允許此類對線程數據的動態(tài)初始化,因為將來可能要對線程本地存儲功能進行增強。

            • 如果 DLL 將任何非本地數據或對象聲明為 __declspec(線程),動態(tài)加載該 DLL 時會導致保護錯誤。使用 LoadLibrary 加載所有 DLL 后,每當代碼引用非本地 __declspec(線程)數據時,將導致系統故障。由于線程的全局變量空間是在運行時分配的,因此此空間的大小是以應用程序的需求和所有靜態(tài)鏈接的 DLL 的需求相加為基礎計算出來的。使用 LoadLibrary 時,無法擴展此空間以允許放置用 __declspec(線程)聲明的線程本地變量。如果 DLL 可能是用 LoadLibrary 加載的,請在 DLL 中使用 TLS API(如 TlsAlloc)來分配 TLS。

            posted on 2008-06-27 14:44 肥仔 閱讀(888) 評論(0)  編輯 收藏 引用 所屬分類: VC 存檔

            伊人久久大香线蕉综合热线| 久久综合噜噜激激的五月天| 日韩av无码久久精品免费| 色综合久久天天综线观看| 久久精品夜色噜噜亚洲A∨| 久久免费国产精品一区二区| 成人久久久观看免费毛片| 国产∨亚洲V天堂无码久久久 | 久久久亚洲欧洲日产国码是AV| 99久久精品国产高清一区二区| 久久99精品国产麻豆| 精品久久人妻av中文字幕| 久久精品国产亚洲网站| 久久精品成人免费网站| 国产日韩久久久精品影院首页| 9191精品国产免费久久| 精品久久久久国产免费| 久久人与动人物a级毛片| 欧美黑人又粗又大久久久| 久久国产精品-国产精品| 国内精品久久久久久中文字幕| 久久婷婷五月综合色99啪ak| 久久久无码精品亚洲日韩京东传媒| 国内精品久久久久久久久电影网| 亚洲国产精品无码久久久蜜芽| 精品一区二区久久| 亚洲欧美精品一区久久中文字幕 | 亚洲人AV永久一区二区三区久久| 99精品国产免费久久久久久下载| 亚洲精品乱码久久久久久| 久久亚洲国产中v天仙www| 亚洲AⅤ优女AV综合久久久| 久久夜色精品国产欧美乱| 久久国产影院| 欧美亚洲色综久久精品国产| 久久av免费天堂小草播放| 精品熟女少妇AV免费久久| 狠狠人妻久久久久久综合| 久久久一本精品99久久精品66| 久久影院久久香蕉国产线看观看| 久久精品国产亚洲77777|