这个生产者-消费者实现中是否存在竞争条件?

2023-12-22

在《操作系统概念》(Silberschatz,第 9 版)的 3.4.1 节中,作者提出了生产者-消费者问题,并给出了以下使用循环缓冲区的实现(第 125、126 页)。

//Shared variables

#define BUFFER SIZE 10
struct Item;
Item buffer[BUFFER SIZE];
int in = 0, out = 0;

//buffer is empty when  in == out
//buffer is full when   (in + 1) % BUFFER SIZE == out

//Producer
while (true)
{
    Item next_produced = /*produce item here*/;

    while (((in + 1) % BUFFER SIZE) == out) ; //do nothing

    buffer[in] = next_produced;
    in = (in + 1) % BUFFER SIZE;
}

//Consumer
while (true)
{   
    while (in == out) ;  //do nothing

    Item next_consumed = buffer[out];
    out = (out + 1) % BUFFER SIZE;

    //consume the item in next_consumed here
}

书上说:

本图没有解决的一个问题涉及以下情况: 生产者进程和消费者进程都试图 同时访问共享缓冲区。

我没有看到生产者和消费者会访问的情况same同时缓冲元件。

我的问题是:如果生产者和消费者在两个线程中运行,那么此实现中是否存在竞争条件或其他同步问题?


有很多可能性

  1. 最明显的是:如果有 2 个生产者生产数据。假设缓冲区中只有 1 个可用空间,两个生产者线程都可以通过while (in + 1) % BUFFER SIZE) == out并尝试放入缓冲区。这可能会导致缓冲区损坏或数据丢失

  2. 即使只有 1 个消费者和 1 个生产者,仍然存在一些不太明显的问题。例如,编译器可能会重新排列行

    buffer[in] = next_produced;
    in = (in + 1) % BUFFER SIZE;
    

    进行更新in发生早于更新buffer,这会导致消费者访问未初始化的数据。

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

这个生产者-消费者实现中是否存在竞争条件? 的相关文章

  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • WPF 从主线程以外的其他线程截屏

    我有一个线程用于侦听 WPF 应用程序的命令 如果 WPF 应用程序收到截取屏幕截图的命令 则任务将移交给 screenshotService 我在互联网上的某个地方找到了一些代码来截取屏幕截图 似乎可以工作 但我还没有想清楚 我无法从另一
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • 如何在 ios 中保存、检索、删除和更新 Plist 文件中的数据?

    我正在创建一个 iPhone 应用程序 在其中我可以获取所有国家 地区名称 徽标和玩家名称 我想将该数据保存在 plist代替sqlite服务器 我不知道如何创建 plist 文件DocumentDirectory并保存数据 请有人建议我如
  • javascript select2 允许的标签

    我需要允许用户在选择中仅选择允许的标签 目前我有 input id txtcolor select2 tags red green blue 你能帮我吗 从 3 3 开始 您可以在使用始终返回 null 的标签时指定自己的 createSe
  • 设置浏览器时区(超过四个字母)[重复]

    这个问题在这里已经有答案了 SET TZ AEST 9 c Program Files x86 Mozilla Firefox firefox exe 测试针对 https whoer net https whoer net 请注意它如何显
  • C++ 中的 POD 类型是什么? [复制]

    这个问题在这里已经有答案了 我曾多次遇到过 POD 型 这个术语 这是什么意思 POD代表普通旧数据 即一个类 是否使用关键字定义struct或关键字class 没有构造函数 析构函数和虚拟成员函数 维基百科关于 POD 的文章 http
  • 带有 AdMob 的 Google Play 服务。检查可用性?

    我正在从 AdMob SDK 迁移到 Google Play 服务 我已经完成了大部分工作 并且一切似乎都运行良好 但我不确定我是否理解某些交互背后的逻辑 我所做的更改可以在这里找到 Google Play 服务迁移 https devel
  • 如何找到最近的事件元素

    我正在使用 jQuery 我想找到最近的班级 hidebox到创建事件的元素 我尝试使用parent find and closest但它们都指的是我的元素所在的级别 我只是寻找最近的 hidebox我可以找到我的事件元素的类 tr td
  • 如何使用 Notepad++ 正则表达式搜索来匹配 HTML 属性?

    这是我的文字 span class c1 Testing this string span 我想以这样的方式结束 span Testing this string span 所以我尝试在 Notepad 中使用这个正则表达式来替换任何内容
  • mv 等效 rsync 命令 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在尝试将文件夹移动到另一个文件夹使用命令行 如果已经存在则覆盖 但在使用 mv 时出现错误 是目录 example mv src test des
  • 标识符指的是组件的私有成员

    html
  • TCP 连接的可靠性如何?

    我已经编写了服务器 客户端应用程序 服务器是用c 编写的 客户端代码是使用java编写的 通信协议是TCP 使用 tcp 传输文件时 可能会发送丢失的数据 换句话说 tcp 是否保证数据正确到达 我是否应该发送该文件的标头信息以检查错误 例
  • Django:如何对更新视图/表单进行单元测试

    我正在尝试对我的更新表单和视图进行单元测试 我使用 Django Crispy Forms 来创建和更新表单 UpdateForm 继承了 CreateForm 并对提交按钮文本做了一些小改动 CreateView 和UpdateView
  • PHP:启动 PayPal 结帐的简单方法?

    我有功能齐全的购物车解决方案 我想要的只是我实际传递产品名称 总数 退货地址和我的贝宝地址的代码 以便它可以将我引导到购物车 有人能引导我走向正确的方向吗 PayPal 有上百万个不同的版本 我了解到我需要的是 paypal 网站付款 有人
  • TCP流回放工具

    我正在寻找一种用于记录和重放 TCP 流一侧以进行测试的工具 我看到记录整个 TCP 流 服务器和客户端 用于测试防火墙等的工具 但我正在寻找的是一种工具 它仅记录客户端提交的流量 带有计时信息 然后重新提交到服务器进行测试 由于 TCP
  • Django - Crispy Forms - 自定义输入定位和内联单选按钮

    我不久前一直在使用 django crispy forms 并我想知道是否有一种方法可以设置输入的位置 例如col md XX类或其他东西 使其看起来更好 而不仅仅是字段列表 这是一个例子 This is a normal render o
  • Neo4j 浏览器无法在 Google Chrome 中运行

    在 MacOS Yosemite 10 10 3 中升级到最新的 XCode Command Tools 后 无法使用 Chrome 版本 42 0 2311 90 64 位 作为 neo4j 浏览器客户端 不过 Safari 运行良好 有
  • 高效的纯文本模板引擎

    我有一个简单的警报系统 可以抓取网络上的号码 将它们与预定义的文本模板混合以获取警报 并将其发送给客户 警报是非常简单的纯文本 所以除了纯文本 数字 简单函数 例如 ifthenelse 之外 我不会期望太多 越快越好 那么有没有现成的开源
  • 使用 realloc 调整缓冲区大小

    如果指向的区域被移动 则会出现 free ptr 已完成 您能解释一下上面的内容吗realloc 此行来自 calloc malloc realloc 和 free 的手册页 我认为这更好地解释了这一点 如果没有足够的空间 扩展当前块 当前
  • 暂停NS操作

    I have NSOperationQueue和一些NSOperations in it NSInvocationOperations 尤其 此操作会进行一些计算并相应地更改 UI 元素的状态 当然 通过performSelectorOnM
  • 如何在我的用户名中使用带有 @ 符号的 linux 命令行 ftp? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 当我的用户名有一个时 如何在 Linux 命令行上运行它 中间签个字 ftp u user password host destinati
  • 这个生产者-消费者实现中是否存在竞争条件?

    在 操作系统概念 Silberschatz 第 9 版 的 3 4 1 节中 作者提出了生产者 消费者问题 并给出了以下使用循环缓冲区的实现 第 125 126 页 Shared variables define BUFFER SIZE 1