UnsafeQueueUserWorkItem 以及“不传播调用堆栈”到底是什么意思?

2024-03-26

我正在阅读和学习ThreadScheduler以及有关任务的文章并遇到了该功能ThreadPool.UnsafeQueueUserWorkItem用于其中之一MSDN 示例 http://msdn.microsoft.com/en-us/library/system.threading.tasks.taskscheduler.aspx关于自己的ThreadSchedulers。在 MSDN 中关于 UnsafeQueueUserWorkItem 的描述 http://msdn.microsoft.com/en-us/library/system.threading.threadpool.unsafequeueuserworkitem.aspx有一个很大的警告,该功能可能是一个安全漏洞,并且它“不传播调用堆栈".

唯一的链接是QueueUserWorkItem从名字上看,哪个似乎是“安全的对应物”?但也没有提及任何有关调用堆栈的内容。

传播堆栈到底意味着什么?在工作开始之前把它复制过来?为什么另一个线程仍然需要调用线程的堆栈?我假设他们从一个新鲜且空的堆栈开始。毕竟,当线程函数返回时,它不会继续执行调度Task的函数,对吧?


它是 CAS(代码访问安全性)的实现细节。它可以检查线程是否有足够的权限来执行操作。仅当代码在受限的安全环境中运行而不是在完全信任的情况下运行或在沙箱中运行时才重要。

完成这项工作的管道很复杂,我只能大致了解它的工作方式。 ExecutionContext 类很关键,它决定了代码运行的安全上下文。当以受限权限运行的线程启动另一个线程时,事情会变得困难。显然,其他线程需要在与原始线程相同的限制下运行。 CAS 依赖于执行堆栈遍历来发现限制的能力。这在另一个线程上很困难,它有自己的堆栈。

ExecutionContext.Capture() 方法在这里发挥着重要作用。它复制调用线程的上下文,包括进行堆栈遍历以创建所发现的安全属性的“压缩”堆栈。然后新线程使用捕获的上下文运行。

ThreadPool.UnsafeQueueUserWorkItem() 会跳过 Capture() 调用。线程池线程将使用默认执行上下文运行。

这是一种优化,Capture() 不是一个便宜的方法。对于依赖 TP 线程快速完成工作的程序来说,这一点很重要。我首先想到的是网络服务器。还有使用该方法的代码类型,例如,您会看到它在 System.Net 命名空间中的内部方法中使用。

显然它是不安全的,它不按照原始线程的 CAS 限制运行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UnsafeQueueUserWorkItem 以及“不传播调用堆栈”到底是什么意思? 的相关文章

  • 为什么存在 async 关键字

    浏览 msdn 9 频道视频时 我发现以下未答复的评论 希望有人能解释一下 我不明白 async 关键字的意义 为什么不直接允许 任何时候方法返回任务时都会使用await关键字 就像迭代器一样 可以在任何返回 IEnumerable 的方法
  • 具有不同大小结构的结构数组的 malloc()

    如果每个结构都包含一个大小不同的字符串数组 那么如何正确地 malloc 一个结构数组 因此每个结构可能有不同的大小 并且不可能 realloc 结构体数量 sizeof 结构体名称 after malloc 初始大小 sizeof 结构名
  • System.IO.IOException:由于意外>数据包格式,握手失败?

    有谁知道这意味着什么 System Net WebException 底层连接已关闭 发送时发生意外错误 gt System IO IOException 由于意外 握手失败 数据包格式 在 System Net Security SslS
  • C# 正则表达式用于查找 中具有特定结尾的链接

    我需要一个正则表达式模式来查找字符串 带有 HTML 代码 中的链接 以获取文件结尾如 gif 或 png 的链接 示例字符串 a href site com folder picture png target blank picture
  • 如何使用MySqlCommand和prepare语句进行多行插入?(#C)

    Mysql 给出了如何使用准备语句和 NET 插入行的示例 http dev mysql com doc refman 5 5 en connector net programming prepared html http dev mysq
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何
  • TcpClient 在异步读取期间断开连接

    我有几个关于完成 tcp 连接的问题 客户端使用 Tcp 连接到我的服务器 在接受客户端后listener BeginAcceptTcpClient ConnectionEstabilishedCallback null 我开始阅读netw
  • 将带有 glut 的点击坐标添加到向量链接列表中

    我想创建一个向量链接列表 并在 GLUT 库的帮助下获取点击的位置并将它们附加到链接列表中 这些是我写的结构 typedef struct vector int x int y Vector typedef struct VectorLis
  • 从 Code::Blocks 运行程序时出现空白控制台窗口 [重复]

    这个问题在这里已经有答案了 当我尝试在 Code Blocks 中构建并运行新程序时 控制台窗口弹出空白 我必须单击退出按钮才能停止它 它对我尝试过的任何新项目 包括 Hello world 都执行此操作 奇怪的是 它对于我拥有的任何旧项目
  • 从成员函数指针类型生成函子

    我正在尝试简化 通过make fn 预处理参数的函子的生成 通过wrap 对于 arity 的成员函数n 生成函子基本上可以工作 但到目前为止只能通过显式指定成员函数的参数类型来实现 现在我想从它处理的成员函数类型生成正确的函子 struc
  • 为什么 clang 使用 -O0 生成低效的 asm(对于这个简单的浮点和)?

    我正在 llvm clang Apple LLVM 版本 8 0 0 clang 800 0 42 1 上反汇编此代码 int main float a 0 151234 float b 0 2 float c a b printf f c
  • C++11 动态线程池

    最近 我一直在尝试寻找一个用于线程并发任务的库 理想情况下 是一个在线程上调用函数的简单接口 任何时候都有 n 个线程 有些线程比其他线程完成得更快 并且到达的时间不同 首先我尝试了 Rx 它在 C 中非常棒 我还研究了 Blocks 和
  • 如何随着分辨率的变化自动调整大小和调整表单控件

    我注意到某些应用程序会更改控件的位置以尽可能适应当前的分辨率 例如 如果窗口最大化 则控件的设置方式应使整个 GUI 看起来平衡 是否可以使用 C 在 Visual studio 2010 中制作或实现此功能 Use Dock http m
  • .NET 客户端中 Google 表格中的条件格式请求

    我知道如何在 Google Sheets API 中对值和其他格式进行批量电子表格更新请求 但条件格式似乎有所不同 我已正确设置请求 AddConditionalFormatRuleRequest formatRequest new Add
  • asp.net网格分页的SQL查询

    我在用iBatis and SQLServer 使用偏移量和限制进行分页查询的最佳方法是什么 也许我添加该列ROW NUMBER OVER ORDER BY Id AS RowNum 但这只会阻止简单查询的数据访问 在某些情况下 我使用选择
  • 如何引用解决方案之外的项目?

    我有一个 Visual Studio C 解决方案 其中包含一些项目 其中一个项目需要引用另一个不属于解决方案的项目 一开始我引用了dll
  • Visual Studio 2017 完全支持 C99 吗?

    Visual Studio 的最新版本改进了对 C99 的支持 最新版本VS2017现在支持所有C99吗 如果没有 C99 还缺少哪些功能 No https learn microsoft com en us cpp visual cpp
  • 受限 AppDomain 中的代码访问安全异常

    Goal 我需要在权限非常有限的 AppDomain 中运行一些代码 它不应该访问任何花哨或不安全的内容 except对于我在其他地方定义的一些辅助方法 我做了什么 我正在创建一个具有所需基本权限的沙箱 AppDomain 并创建一个运行代
  • 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同

    System Net WebException 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同 在 System Net FtpWebRequest CheckError 在 System Net FtpWebReque
  • C#中为线程指定特殊的cpu

    我有 2 个线程 我想告诉其中一个在第一个 cpu 上运行 第二个在第二个 cpu 上运行 例如在具有两个 cpu 的机器中 我怎样才能做到这一点 这是我的代码 UCI UCIMain new UCI Thread UCIThread ne

随机推荐

  • 重写java中的方法,然后将对象转换为父类行为

    我有一个父类 A 和一个子类 B B 重写了 A 中的方法 f public class A public String f return A public class B extends A public String f return
  • Monotouch/WCF:为什么无法覆盖wcf绑定超时设置

    Monotouch WCF 为什么无法覆盖 wcf 绑定默认超时设置 public class MyServiceClient ClientBase
  • Jade/Pug if else 条件用法

    我正在使用 js 文件将日期发送到 jade 文件Node js 当 的时候 date 场是false 它执行 else 并打印man因为它的答案 可能出了什么问题 if date false date else man 如果 date 为
  • ActiveRecord什么时候保存关联?

    我知道它会保存关联autosave true as per https api rubyonrails org classes ActiveRecord AutosaveAssociation html https api rubyonra
  • 按照这些规范用Python制作一个空心盒子?

    我要 编写一个 python 程序 提示用户输入一个正整数 n 然后该程序打印一个包含 n 行和 2 n 列的空心矩形 例如 输入 3 将输出 我的代码是 n int input Please enter a positive intege
  • 对片段之间的过渡进行动画处理

    我正在尝试为片段之间的过渡设置动画 我从以下得到了答案 Android 片段和动画 https stackoverflow com questions 4817900 android fragments and animation Frag
  • 将匿名对象传递给视图

    我想将两个值从控制器操作传递到 asp net MVC 3 Razor 视图 我在操作方法中这样做 var model new reportid rid refno refernumber return View model 但是当我尝试像
  • 在 FB 和 LINKEDIN 上共享文本与页面文本?

    我刚刚偶然发现在 Facebook LinkedIn 上将文本 主题标签 与文本一起共享 这是我正在尝试做的事情 标签 STUFF li class facebook a target blank href facebook a li 不幸
  • SSIS 脚本任务在计划时不工作

    我找不到类似的问题 我有一个 SSIS 包 其中包含一个 Visual Basic 脚本任务 其中包含以下行 msgbox some text 它从 BIDS 运行良好 并从 MSDB 手动执行 但当我在 SQL Server 代理中安排它
  • 了解缓存?

    昨天 我们家里没有电 因此无法上网 所以我认为我无法让我的网络应用程序在本地工作 因为在 index html 末尾我有
  • 如何在 macOS 上的 Sublime Text 中在同一窗口中打开文件和文件夹?

    如果我打开 foo txt然后打开 baz bar txt从终端 Sublime Text 总是打开 2 个不同的窗口 打开所有这些不同的窗户真是令人烦恼 我尝试过更改 ST 的一些设置 但似乎没有任何办法可以解决这个问题 有没有办法让所有
  • 插件包的 Xcode 单元测试

    我想将单元测试添加到我的应用程序中 不幸的是 目前大部分功能都位于插件中 我的插件基础设施由一个带有插件基类和一些共享帮助器类和资源的框架组成 现在我想添加一个能够测试我的插件的单元测试 我想创建一个 测试 应用程序来加载该包并将所有调用重
  • Ruby BCrypt 哈希比较

    我正在尝试使用 Sinatra 和 BCrypt 实现看似非常简单的身份验证方法 但显然我错过了一些东西 用户预先分配了一个临时密码 该密码以明文形式存储在数据库中 我根据临时密码进行身份验证 然后创建 salt 和 password ha
  • 使用 strtotime() 从字符串(各种时间单位)中减去间隔;

    我正在创建一个票务系统 我已经存储了票证创建日期和当前日期之间的间隔 每张票证都有一个存储为字符串的解决时间限制 targetTime 15 分钟 4 小时等 我试图通过从时间限制字符串中减去间隔来计算剩余时间 我尝试在 targetTim
  • 将 NULL 值插入双精度数据类型 MySQL Python

    我有一张桌子 这是创建语句 CREATE TABLE runsettings runnumber mediumint 9 NOT NULL equipment varchar 45 NOT NULL wafer varchar 45 NOT
  • 将 Unix 纪元时间戳转换为 JavaScript 日期时间戳

    我有一个带有 Unix 纪元时间戳的数据库 我想在 Highcharts 图表中绘制这些值 这需要 JavaScript 日期时间戳 自 1970 年 1 月 1 日以来的毫秒数 数据库数组当前如下所示 data 1519395624 10
  • 无法在 Anko 中调用 StartActivityForResult

    我对 android 还很陌生 我正在尝试用 kotlin 来学习它 在这段代码中 mHelp setOnClickListener context startActivity
  • python中连接数据点的线的箱线图

    我试图根据与点相关的特定关系来连接线 在此示例中 线条将连接玩家所在的球场 我可以创建基本结构 但还没有找到一种相当简单的方法来创建此附加功能 import pandas as pd import numpy as np import ma
  • HTML5 Web 应用程序中 OAuth2 的本地存储与 cookie

    我目前正在尝试使用 OAuth2 来开发一个完全用 JavaScript 构建的移动应用程序 该应用程序与 CakePHP API 进行通信 查看以下代码以了解我的应用程序当前的外观 请注意 这是一个实验 因此代码混乱 区域缺乏结构等 va
  • UnsafeQueueUserWorkItem 以及“不传播调用堆栈”到底是什么意思?

    我正在阅读和学习ThreadScheduler以及有关任务的文章并遇到了该功能ThreadPool UnsafeQueueUserWorkItem用于其中之一MSDN 示例 http msdn microsoft com en us lib