4
一般而言,哪些线程共享?
好吧,这是一个普遍的问题。而且,如果有人想使其实现特定,那么我将更喜欢Unix相关的东西。但首先需要普遍了解以下问题: 我读到单个进程可以有多个线程。同一进程的多个线程确实在它们之间共享事物。我想知道他们分享什么,不分享什么。考虑到进程由地址空间,堆栈,堆,全局变量,代码,数据,OS资源组成,线程之间共享哪些资源?我有以下猜测: 全局变量-我已读取线程共享全局变量。同样,在用Java和C#编程时,我创建了线程来共享类级变量。因此,我认为线程共享全局变量(尽管不能确定高级编程语言中的概念是否可以转换为低操作系统级别的事实)。 堆-由于全局变量存储在堆中,因此堆在线程之间共享。 堆栈-由于每个线程可以具有自己的执行序列/代码,因此它必须具有自己的堆栈,可以在该堆栈上推入/弹出程序计数器的内容(在发生函数调用和返回的情况下)。因此,同一进程的线程不共享堆栈。 现在我不确定以下内容的共享 地址空间-不确定在地址空间中到底要算什么。但是我想地址空间通常用于进程而不是线程的上下文中。而且,由于同一进程的所有线程与父进程位于同一地址空间,因此可以说线程共享地址空间。(但是,然后它们在同一地址空间内维护不同的堆栈吗?) 操作系统资源-我猜这可能是特定于实现的。例如,父进程可以选择性地将同一文件的句柄分配给它的某些线程,而不是全部。还是我误会了,操作系统资源意味着文件以外的东西? 代码-线程可以具有不同的代码,因此共享代码并非总是如此。 数据-不确定要在数据下考虑什么。但是请确保全局变量在线程之间共享。并确保不会局部共享局部变量。 总体而言,由于术语含糊,操作系统书籍中的超级概括以及在线提供的额外的实现特定细节,我感到非常困惑。因此,我试图找到一些令我满意的答案。