Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么是线程上下文?_C#_Java_Multithreading_Synchronization - Fatal编程技术网

C# 什么是线程上下文?

C# 什么是线程上下文?,c#,java,multithreading,synchronization,C#,Java,Multithreading,Synchronization,线程的上下文是否指线程的个人内存?如果是这样,多个线程之间如何共享内存 我不是在寻找代码示例——我从较高的层次上理解同步,我只是对这个术语感到困惑,并希望了解幕后实际发生的事情 我之所以认为/认为每个线程都有某种私有内存,是因为Java和.NET中的volatile关键字,以及如果不使用同一原语,不同的线程可以为同一原语提供不同的值。那对我来说总是暗示着私人记忆 由于我没有意识到这个术语更一般,我想我是在问上下文切换在Java和C语言中是如何工作的。具体而言,“线程上下文”的实际组成是特定于实现

线程的上下文是否指线程的个人内存?如果是这样,多个线程之间如何共享内存

我不是在寻找代码示例——我从较高的层次上理解同步,我只是对这个术语感到困惑,并希望了解幕后实际发生的事情

我之所以认为/认为每个线程都有某种私有内存,是因为Java和.NET中的volatile关键字,以及如果不使用同一原语,不同的线程可以为同一原语提供不同的值。那对我来说总是暗示着私人记忆

由于我没有意识到这个术语更一般,我想我是在问上下文切换在Java和C语言中是如何工作的。具体而言,“线程上下文”的实际组成是特定于实现的,但通常我总是理解线程的上下文指线程的当前状态以及它在特定时间如何查看内存。这就是“上下文切换”的含义。。保存和恢复线程(其上下文)的状态

内存在上下文之间共享。。它们是同一过程的一部分

我不认为自己是这个话题的专家。但这就是我一直理解的那个特定术语的意思

我之所以认为/认为每个线程都有某种私有内存,是因为Java和.NET中的volatile关键字,以及如果不使用同一原语,不同的线程可以为同一原语提供不同的值。那对我来说总是暗示着私人记忆

好了,现在我们来谈谈你困惑的根源。这是现代编程中最令人困惑的部分之一。你必须正视这一矛盾:

  • 进程中的所有线程共享相同的虚拟内存地址空间,但
  • 任何两个线程在任何时候都可以在该空间的内容上存在分歧
这怎么可能?因为

  • 出于性能原因,处理器会制作内存页的本地副本,并且只会偶尔比较注释以确保其所有副本所说的内容相同。如果两个线程位于两个不同的处理器上,那么它们对“相同”内存的看法可能完全不一致

  • 单线程场景中的内存通常被认为是“静止的”,除非有什么东西导致它发生变化这种直觉在多线程进程中效果不佳。如果有多个线程访问内存,最好将所有内存视为始终处于不断变化的状态,除非有什么东西迫使它保持静止。一旦您开始认为所有内存都在不断变化,那么很明显,两个线程的视图可能不一致。没有两部关于风暴期间海洋的电影是相同的,即使是同一场风暴

  • 编译器可以自由地对单线程系统上看不见的代码进行任何优化。在多线程系统上,这些优化可能突然变得可见,从而导致数据视图不一致

如果这些都不清楚,那么请阅读我的文章,解释“volatile”在C#中的含义:

然后阅读Vance文章中的“内存模型的需求”一节:

现在,对于线程是否有自己的内存块这一特定问题,答案是肯定的,有两种。首先,由于线程是控制点,堆栈是控制流的具体化,因此每个线程都有自己的百万字节堆栈。这就是线程如此昂贵的原因。在.NET中,每次创建线程时,这些百万字节实际上都会提交到页面文件中,因此要小心创建不必要的线程


其次,线程有一个恰当的名称“线程本地存储”,它是与每个线程相关联的一小部分内存,线程可以使用它来存储感兴趣的信息。在C#中,您可以使用
ThreadStatic
属性将字段标记为线程的本地字段。

提供获得“线程上下文”的上下文可以帮助您找到答案。线程在.Net内存模型中没有“个人内存副本”…Alexei是绝对正确的;如果不说你在哪里听到这个词或者它是如何使用的,很难说。例如,在基于任务的异步模式中,有一个称为线程上下文的对象,当您谈论TAP编程时,它具有非常特定的含义。(因为已完成任务的继续始终计划在与等待任务的线程具有相同“上下文”的线程中运行。)特别是,您是否询问
thread
对象的
CurrentContext
属性的含义?不管“上下文”是什么意思,我完全搞不懂“范围”是什么意思——范围是有名称的事物的属性,只有在编译时才有意义。例如,字段的范围是程序文本的区域,在该区域中,该字段可以通过其非限定名称引用。这与线程有什么关系?我也不明白你说的“个人记忆副本”是什么意思。记忆不是这样工作的。虚拟地址空间是每个进程的,而不是每个线程的。总而言之,现在我甚至不确定这个问题是否可以回答。你能澄清一下吗?谢谢你已经做的一切,+1。线程在C#/Java中是否有个人内存?这是我唯一没有答案的事情。那么C#/Java中的线程上下文指的是线程所说的内存的本地副本是什么?顺便说一句,这是一个很棒的答案。@williammerrison:我不知道“线程上下文”是什么意思。在谈到C时,我不会使用“线程上下文”来表示“由
thread
对象的
CurrentContext
属性返回的对象”。例如,考虑一个负责运行UI刷新的线程和一个负责线程的线程。