簡體   English   中英

什么是線程上下文?

[英]What is threading context?

線程的上下文是否指的是線程的個人記憶? 如果是這樣,如何在多個線程之間共享內存?

我不是在尋找代碼示例 - 我在高層次上理解同步,我只是對這個術語感到困惑,並希望深入了解幕后實際發生的事情。

我認為/認為每個線程都有某種私有內存的原因是因為 Java 和 .NET 中的 volatile 關鍵字,以及如果不使用相同的原語,不同的線程可以具有不同的值。 這對我來說總是暗示着私人記憶。

由於我沒有意識到這個術語更籠統,我想我是在問上下文切換在 Java 和 C# 中是如何工作的。

我認為/認為每個線程都有某種私有內存的原因是因為 Java 和 .NET 中的 volatile 關鍵字,以及如果不使用相同的原語,不同的線程可以具有不同的值。 這對我來說總是暗示着私人記憶。

好的,現在我們要了解你困惑的根源了。 這是現代編程中最令人困惑的部分之一。 你必須解決這個矛盾:

  • 一個進程中的所有線程共享相同的虛擬內存地址空間,但
  • 任何兩個線程都可以隨時對該空間的內容產生分歧

怎么會這樣? 因為

  • 處理器出於性能原因制作內存頁的本地副本,並且很少比較筆記以確保它們的所有副本都說同樣的話。 如果兩個線程在兩個不同的處理器上,那么它們對“相同”內存的看法可能完全不一致。

  • 單線程場景中的內存通常被認為是“靜止的”,除非某些原因導致它發生變化。 這種直覺在多線程進程中效果不佳 如果有多個線程訪問內存,您最好將所有內存視為始終處於不斷變化的狀態,除非某些東西迫使它保持靜止。 一旦您開始將所有內存視為一直在變化,就很明顯兩個線程可能具有不一致的視圖。 沒有兩部風暴期間的海洋電影是相同的,即使是同一場風暴。

  • 編譯器可以自由地對在單線程系統上不可見的代碼進行任何優化。 在多線程系統上,這些優化可能會突然變得可見,從而導致數據視圖不一致。

如果其中任何一個不清楚,那么請先閱讀我的文章,該文章解釋了 C# 中“易失性”的含義:

http://blogs.msdn.com/b/ericlippert/archive/2011/06/16/atomicity-volatility-and-immutability-are-different-part-three.aspx

然后在這里閱讀 Vance 文章中的“The Need For Memory Models”部分:

http://msdn.microsoft.com/en-us/magazine/cc163715.aspx

現在,對於線程是否有自己的內存塊的具體問題,答案是肯定的,有兩種方式。 首先,由於線程是一個控制點,棧是控制流的具體化,每個線程都有自己的百萬字節棧。 這就是線程如此昂貴的原因。 在 .NET 中,每次創建線程時,這些百萬字節實際上都會提交到頁面文件中,因此要小心創建不必要的線程。

其次,線程具有恰當命名的“線程本地存儲”,這是與每個線程相關聯的一小部分內存,線程可以使用它來存儲有趣的信息。 在 C# 中,您使用ThreadStatic屬性將字段標記為線程的本地字段。

“線程上下文”的實際組成是特定於實現的,但通常我一直理解線程的上下文是指線程的當前狀態以及它在特定時間查看內存的方式。 這就是“上下文切換”的含義。保存和恢復線程的狀態(它的上下文)。

內存在上下文之間共享......它們是同一進程的一部分。

我不認為自己是該主題的專家……但這就是我一直理解的特定術語的含義。

線程的上下文是否引用了線程的個人內存? 如果是這樣,如何在多個線程之間共享內存?

我不是在尋找代碼示例-我理解了高水平的同步,我只是對這個術語感到困惑,並希望對幕后實際發生的事情有所了解。

我認為/認為每個線程都具有某種專用內存的原因是由於Java和.NET中的volatile關鍵字,以及如果不使用同一個原語,不同的線程如何具有不同的值。 那總是暗示着我的私人記憶。

由於我沒有意識到該術語更籠統,我想我是在問上下文切換在Java和C#中是如何工作的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM