线程 - 访问资源避免饥饿

2024-04-20

我知道这不是一个“作业助手网站”,但最近几天我疯了,因为我必须实现对资源的访问以避免饥饿,但我不知道如何做到这一点。谁能帮助我提供一些应用程序示例或文档?分配是:资源可以由两种类型的进程使用:黑色和白色。当白色进程使用该资源时,黑色进程就不能使用该资源,反之亦然。实现对资源的访问,避免饥饿。这是一个生产者-消费者的案例吗?


让我们做一些假设(为了讨论):

  • 我们的进程将是线程——而不是实际的软件进程,两者之间存在差异,这对您的作业可能很重要。
  • 白色进程是读者。
  • 黑色进程是作家。
  • 我们的共同资源是特定的变量。

互斥锁(mutex http://en.wikipedia.org/wiki/Mutual_exclusion):

互斥锁是一种排它锁,它具有二进制状态,要么锁定,要么解锁。您可以锁定它、解锁它或检查它是否已锁定。

线程可以使用互斥锁(互斥锁)相互锁定,就像进程可以使用信号量相互锁定一样。

当您想要保护一个变量不被两个线程同时使用时,您可以为该变量创建一个互斥体并写入每个线程,以便它在尝试使用该变量之前尝试锁定互斥体并在使用完成后解锁它。

这使得任何第一个线程锁定互斥体并阻止任何后续线程,直到第一个线程解锁互斥体,基本上强制所有这些线程排队并按顺序操作该特定变量。

当您只想读取变量而不更改其值时,这有点无效,因为读取相同内容的两个线程不会创建任何冲突或无效数据。然而,两个线程同时写入可能会损坏数据。

读者/写者锁 http://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock (RWL):

大多数读/写锁的实现都会使用共享锁和独占锁,但它们公开了一种简单的使用方法:如果你想读,就获取“读锁”,如果你想写,就获取“写锁”。

“读锁”不是独占的,它们允许多个读者在某一特定时间进行读取(无阻塞)。

“写锁”是独占的,只有一个写入者可以在某一特定时间进行写入(无阻塞)。

饥饿:

  • 第一步:读取器/写入器锁是当第一个(读取)线程获取变量上的“读取锁”,第二个(写入)线程尝试获取“写入锁”但被阻塞,直到所有读取器完成读取时发生的事件。
  • 第二步:在第一个线程完成读取之前,第三个(读取)线程获取变量上的“读锁”;这意味着第二个(写入)线程必须等待第三个线程完成。

重复第二步,直到达到饥饿状态。

避免饥饿Seqlock http://en.wikipedia.org/wiki/Seqlock:

seqlock 是通过一个互斥锁和一些计数器来实现的。它始终允许读取,即使写入者正在写入变量,但它为读取器提供了一种检查数据在读取期间是否已写入的方法,如果是,则可能会损坏,因此读取器必须重新读取数据并再次检查一致性。

“读取和一致性检查”阶段循环运行,直到检查确认数据的一致性,此时读取器可以继续执行其通常的任务。

编写者使用互斥锁来获取独占访问权限,因此他们永远不会重叠操作。

这对于高读低写的情况很有用。如果写入者太多,读取者将不断循环地重新读取数据。

您的具体情况:

如果黑色进程需要能够在它们之间共享资源,而白色进程需要能够在它们之间共享资源,但白色进程不能与黑色进程共享资源,那么解决方案将不是 RWL 或 Seqlock。

Seqlock 算法的变体可能是您的解决方案。

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

线程 - 访问资源避免饥饿 的相关文章

  • 是否已经有一些基于 std::vector 的 set/map 实现?

    对于小型集合或地图 通常使用排序向量而不是基于树的向量要快得多set map 特别是对于 5 10 个元素的情况 LLVM 有一些类本着这种精神 http llvm org docs ProgrammersManual html ds se
  • 如何更改 GridView 内 ListViewItemPresenter 中的 SelectedBackground

    我在 SubSection 中有一个 Clickable Gridview
  • 无法使用 MinGW C++ 在 NetBeans IDE 7.3 中编译“Hello World”

    我正在尝试制作一个简单的 Hello World 在 NetBeans IDE 7 3 中使用 MinGW 作为我的 C 编译器来编写程序 我遇到了构建失败的情况 但我不知道为什么 这是我的编译器设置 Family MinGW 基本目录 C
  • 以 ASCII 字符串形式获取 MemoryStream 内容的快速方法

    我在 MemoryStream 中有一个 JSON 字符串 我使用以下代码将其作为 ASCII 字符串获取 MemoryStream memstream new MemoryStream Write a JSON string to mem
  • EWS 消息跟踪报告

    我一直在研究如何使用 EWS 从交换中获取消息跟踪报告 但似乎无法查明任何内容 我打算构建一个抓取日志文件的应用程序 但如果我可以通过 EWS 来完成它 那对我正在做的事情会更好 有任何想法吗 我终于能够为我的问题创建一个解决方案 我在 C
  • 在 C++ 中重用异常处理代码

    我有这两个函数 具有重复的异常处理 其唯一目的是显示错误消息 void func1 noexcept try do task do another task catch const std out of range e show msg O
  • 提高 ASP.NET/C# 编译速度的最佳方法是什么?

    更新 请将您的答案集中在硬件解决方案上 您使用什么硬件 工具 插件来提高 ASP NET 编译和首次执行速度 我们正在寻找固态硬盘来加快速度 但现在价格确实很高 我现在有两个 RAID 0 的 7200 rpm 硬盘 但我对性能不再满意 所
  • 在 LINUX 上测量 TLB 未命中的命令

    有人可以指导我使用一个命令来测量 LINUX 上的 TLB 未命中吗 是否可以将轻微页面错误视为 TLB 未命中 您可以使用perf去做这个 前提是你的CPU支持 Use perf list了解可用的计数器 当我拿到这个列表并查找 TLB
  • /etc/php5/conf.d 文件夹中的 .ini 文件有什么用?

    我知道 ini 文件位于 etc php5 cli与 PHP 的 CLI 使用有关 文件位于 etc php5 fpm是关于 PHP 的 FastCGI FPM 方面 但是位于以下位置的 ini 文件又如何呢 etc php5 conf d
  • 在 Perl 中,如何从父进程向子进程发送消息(或信号),反之亦然?

    我正在编写一个管理多进程的程序 这就是我所做的 而且效果很好 但现在 我想将消息从子进程发送到父进程 反之亦然 从父进程到子进程 你知道最好的方法吗 你知道我所做的是否是我想要的正确方法 从子进程到父进程发送消息 信号或共享内存 反之亦然
  • cuda中有模板化的数学函数吗? [复制]

    这个问题在这里已经有答案了 我一直在寻找 cuda 中的模板化数学函数 但似乎找不到 在普通的 C 中 如果我调用std sqrt它是模板化的 并且将根据参数是浮点数还是双精度数执行不同的版本 我想要这样的 CUDA 设备代码 我的内核将真
  • 拦截C# HttpClient GetAsync

    我有一个 Web 项目 C MVC5 但没有 WebAPI 和一个简单的 HTTP REST 客户端 该客户端调用外部 REST 服务并获取 accessToken 等 我想检查所有 Get PostAsync 调用对 statusCode
  • ASP.NET MVC - 路由 - 具有文件扩展名的操作

    有没有办法实现调用URLhttp mywebsite myarea mycontroller myaction xml这基本上是 假 请求文件 但结果将是一个为动态创建的文件提供服务的操作操作 我试过这个 context MapRoute
  • LINQ 中的左外连接

    下面的代码不断给我一个错误消息 你调用的对象是空的 var partsWithDefaults from partsList1 in p join partsList2 in d on new PartNo partsList1 PartN
  • 如何在c#中打印全尺寸图像

    我正在尝试用 C 打印图像 它是由 Adob e Acrobat 从 PDF 创建的完整 8 5x11 尺寸的 tiff 当我使用下面的代码用 C 打印它时 它垂直打印正确 但水平打印不正确 水平方向被推了大约半英寸 我将图像的原点设置为
  • 如何避免函数的多重定义(Linux、GCC/G++、Code::Blocks)

    我有一个代码块项目 它使用许多不同的文件 通常是由其他程序员编写的 目前我遇到的情况是 我有两个不同的子项目 其中包含以相同方式命名的函数 比方说 F int x 因此 F int x 是在两个不同位置的两个源文件中定义的 并且它们有两个不
  • 初学者友好的方法来获取所有文件和目录的列表

    使用 NET 3 0 我得到了下面的方法 它可以正确返回指定目录的所有文件和目录 以及子目录 的集合 如果可能的话 我想将其简化为仅使用我非常熟悉的结构 具体来说 有以下几点我不太清楚 1 IEnumerable
  • 使用C#在SQL Server上执行sql文件

    我有很多程序 视图 函数等文件 我想在 SQL Server 2005 2008 上的适当数据库中执行这些文件 创建组件 还有一点是我想使用 C 来执行它们 另一点需要提及的是 我希望应用程序也可以在远程 SQL Server 上执行此文件
  • GridView,在代码中添加标题行第 2 部分

    这是这篇文章的延续 但添加了完整的代码 ASP NET GridView 在代码中添加标题行 https stackoverflow com questions 19119004 asp net gridview adding header
  • 我该怎么做才能完全关闭与mcu的tcpClient连接?

    我现在正在研究与 ESP32 中运行的 tcp 服务器的 tcp 套接字连接 通信工作正常 但我无法关闭连接 在搜索关闭 重置 tcpClient 上的解决方案后 似乎关闭 tcpClient 的正确方法应该是 tcpClient GetS

随机推荐

  • 如何处理 Coq 中 Program Fixpoint 生成的非常大的项?

    我试图在 Coq 中定义并证明正确的函数 该函数可以有效地比较两个排序列表 由于它并不总是在结构较小的项上递归 第一个或第二个列表较小 Fixpoint不会接受它 所以我尝试使用Program Fixpoint反而 当尝试使用策略证明函数的
  • 检测蓝牙“通话”按钮按下情况

    我有一个蓝牙耳机 可以与我的手机通信 它有一个大的 通话 按钮 可以接听 结束通话 我正在尝试制作一个应用程序 该应用程序能够在按下通话按钮时进行拦截 我尝试过使用意图过滤器
  • 从 Android Studio 在设备上安装 Android 应用程序

    我正在尝试在 Android 手机 HTC One 上安装我的应用程序 但不确定如何执行此操作 我运行了应用程序 但设备未显示在Choose Device打开的窗口 执行此操作的步骤是什么 您是否激活了设备上的 开发者选项 您必须允许 US
  • 不要直接访问超全局 $_GET 数组

    我是 PHP 新手 所以请原谅我 如果这是一个愚蠢的问题 但为什么我不应该直接访问超全局数组中的项目 NetBeans 警告我不要这样做 参见标题 而且我在其他地方读过同样的内容 但我还没有找到一个很好的解释 会出现什么问题 是否存在安全问
  • 有没有一个javascript方法可以在字符串数组中查找子字符串?

    假设我的数组是 abcdefg hijklmnop 并且我正在查看 mnop 是否是该数组的一部分 我如何使用 javascript 方法来做到这一点 我尝试了这个 但它不起作用 var array abcdefg hijklmnop co
  • 我什么时候应该使用 Odbc、OleDb、SQLClient?有哪些权衡

    我从 SQLServer 数据库开始 所以看来我应该使用System Data SqlClient命名空间 但是 我们有可能关闭 SqlServer 数据库并转到 MySql 或 Oracle 因此 我提出了一套有关 Net 应用程序如何与
  • Visual Studio 2013 浏览器链接无法在 Firefox 中正常运行 - 引发异常

    刚才我在调试一个简单的 ASP NET MVC 应用程序时尝试使用 Firefox 27 0 1 进行浏览器链接 我有 Visual Studio Ultimate 2013 Update 1 这是浏览器链接仪表板 我尝试在剃刀视图中更改某
  • 正则表达式中的波形符运算符

    我想知道正则表达式中波浪线运算符的含义是什么 我有这样的声明 if preg match d 10 POST isbn warnings ISBN should be 10 digits 我发现这个文档解释了波浪号的含义 http en a
  • 如何向角度垫表添加边框半径?

    我正在努力使mat table边框为圆形 但它不起作用 试过这个 table width 100 border collapse collapse border radius 1em 如何实现这一目标 对我来说最简单的解决方案是隐藏某些元素
  • Laravel 1048 存储数据时列不能为 NULL

    当我尝试保存新联系人时 我收到1048 Column username cannot be NULL错误 很明显 这个错误的原因是空值username 但是我想让它工作而不将列设置为 NULL 或检查是否usernamePOST 数据为空
  • Boost Spirit 规则和语法中模板参数中的括号

    看着这个例子 http boost spirit com home articles qi example parsing a list of key value pairs using spirit qi 为了实现 Spirit 解析器
  • 复制期间的字节交换

    我需要有效地交换数组的字节顺序during复制到另一个数组中 源数组是某种类型 char short 或 int 因此所需的字节交换是明确的 并且将根据该类型进行 我的计划是通过多遍字节复制 short 为 2 int 为 4 来非常简单地
  • 如何使用 GCM 在 php 中向数百万 Android 设备发送通知

    我是一名新的 Android 应用程序开发人员 我正在使用 GCM 将 PHP 代码的通知发送到 Android 设备 我制作了所有设备 ID 的数组并发送 但问题是当我发送超过一千个设备时 我发现内部服务器错误 我的代码如下 functi
  • 未定义的方法`fog_host='

    当我尝试运行我的应用程序时 出现以下错误 config initializers carrierwave rb 4 未定义方法 fog host CarrierWave Uploader Base Class NoMethodError 这
  • JavaFX GridPane:如果内容被禁用且不可见则缩小

    如果 GridPane 行的内容既禁用又不可见 是否可以缩小该行 当我将节点设置为disable true和visible false时 单元格仍然占用空间 如果我有 8 行 并且只有第一行和最后一行可见 我不希望空行占用太多空间 好像只有
  • OpenGL 超级采样抗锯齿?

    在办公室 我们正在使用旧的 GLX Motif 软件 该软件使用 OpenGL 的 AccumulationBuffer 来实现保存图像的抗锯齿功能 我们的问题是Apple从其所有驱动程序中删除了AccumulationBuffer 从OS
  • 如何为所有用户设置所有 ulimit 不受限制?

    是的 我想删除all ulimits并将它们设置为unlimited 我该怎么做呢 谢谢 使用这样的东西 for opt in ulimit a sed s a z a zA Z 1 do ulimit opt ulimited done
  • Android中如何增加ScrollView的高度?

    嗨朋友们 我在用GridView里面一个ScrollView用于显示图像 在 GridView 中 我有 16 个动态添加的图像 但是ScrollView不显示全部 16 张图像 参见屏幕截图 我想要ScrollView显示整体GridVi
  • C#:运行 shell 命令时出现问题

    我试图让 PHP 解析器运行一个页面 然后将结果返回到我的服务器 但是当我通过代码运行该命令时 它什么也不返回 我知道该命令是正确的 因为如果我使用相同的路径手动运行它 它就可以正常工作 这是我的代码 var p new Process S
  • 线程 - 访问资源避免饥饿

    我知道这不是一个 作业助手网站 但最近几天我疯了 因为我必须实现对资源的访问以避免饥饿 但我不知道如何做到这一点 谁能帮助我提供一些应用程序示例或文档 分配是 资源可以由两种类型的进程使用 黑色和白色 当白色进程使用该资源时 黑色进程就不能