线程编程中的守护简单列表?

2024-01-07

我正在阅读一本 POSIX 线程书籍进行一些练习,并且我试图找出在一个简单的单链表中需要互斥锁的位置作为一个小练习问题。例如,如果我有一个节点结构列表:

template <typename T>
struct Node
{
    Node<T>* next;
    T data;
};

Node<T>* head = NULL;

//Populate list starting at head...


[HEAD] --> [NEXT] --> [NEXT] --> [NEXT] --> [...] --> [NULL]

我有两个或更多线程。任何线程都可以在列表中的任何点插入、删除或读取。

看来,如果您只是尝试保护单个列表元素(而不是整个列表),您永远无法保证另一个线程不会修改 next* 指针指向的元素,因此您无法保证不变量的安全性和维护。

有没有比让其上的所有操作都使用相同互斥锁更有效的方法来保护此列表?我本来以为会有,但我实在想不到。

另外,如果它是一个双向链表,情况会改变吗?


如果您想使用单链表(即每个节点一个锁)执行细粒度锁定方法,那么您将需要执行以下操作:

  1. 将两个哨兵节点添加到列表中head and tail。这两个节点都有与之关联的锁,每个新节点都会添加到它们之间。
  2. 对于遍历列表的函数,在将下一个节点分配给其他节点之前,您需要获得下一个节点的锁。current指针。在获得下一个节点上的锁定之前,您也无法释放当前节点上的锁定。如果您还使用prev遍历的指针,您将保持对该“前一个”节点的锁定,直到您重新分配prev指向的指针current指针。
  3. 要添加节点,您需要锁定要添加的节点两侧的两个节点。例如,你会有一个prev节点指针,和一个current节点指针。您首先需要将互斥锁锁定在prev节点,然后锁定互斥锁current节点,并在之间添加新节点prev and current node.
  4. 如果要删除节点,您将再次锁定互斥体prev and current节点(按该顺序),然​​后您可以删除current node.

请记住,步骤 #3 和步骤 #4 之所以有效,是因为步骤 #2 中遍历列表需要获取节点上的锁。如果跳过该步骤,当另一个线程更改当前线程下列表的拓扑时,您最终将创建悬空指针以及与错误分配的指针相关的其他问题。

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

线程编程中的守护简单列表? 的相关文章

  • C# 和 Javascript SHA256 哈希的代码示例

    我有一个在服务器端运行的 C 算法 它对 Base64 编码的字符串进行哈希处理 byte salt Convert FromBase64String serverSalt Step 1 SHA256Managed sha256 new S
  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • 如何将图像和 POST 数据上传到 Azure 移动服务 ApiController 终结点?

    我正在尝试上传图片and POST表单数据 尽管理想情况下我希望它是json 到我的端点Azure 移动服务应用 我有ApiController method HttpPost Route api upload databaseId sea
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • 从路径中获取文件夹名称

    我有一些路c server folderName1 another name something another folder 我如何从那里提取最后一个文件夹名称 我尝试了几件事 但没有成功 我只是不想寻找最后的 然后就去休息了 Thank
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • clang 实例化后静态成员初始化

    这样的代码可以用 GCC 编译 但 clang 3 5 失败 include
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • 模拟pytest中的异常终止

    我的多线程应用程序遇到了一个错误 主线程的任何异常终止 例如 未捕获的异常或某些信号 都会导致其他线程之一死锁 并阻止进程干净退出 我解决了这个问题 但我想添加一个测试来防止回归 但是 我不知道如何在 pytest 中模拟异常终止 如果我只
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • 需要哪个版本的 Visual C++ 运行时库?

    microsoft 的最新 vcredist 2010 版 是否包含以前的版本 2008 SP1 和 2005 SP1 还是我需要安装全部 3 个版本 谢谢 你需要所有这些
  • WCF:将随机数添加到 UsernameToken

    我正在尝试连接到用 Java 编写的 Web 服务 但有些东西我无法弄清楚 使用 WCF 和 customBinding 几乎一切似乎都很好 除了 SOAP 消息的一部分 因为它缺少 Nonce 和 Created 部分节点 显然我错过了一
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save

随机推荐

  • 如何使用 PHP 将一个 YouTube 视频上传到另一个 YouTube 频道

    我正在尝试实现用户可以将 Youtube 视频上传到他的 YouTube 频道的功能 从here http www phpgang com how to authenticate upload videos to youtube chann
  • NGRX/存储有效负载类型混淆

    我有以下行动 export const ActionTypes CREATE OH type ORDERHEAD Create Orderhead MODIFY SELECTED OH type ORDERHEAD Select Order
  • 使用干预将图像的 DPI 从 72 更改为 300

    我正在与laravel并使用in用于图像处理 我想增加图像的 DPI 我没有看到任何有关 DPI 的文档here http image intervention io 有什么解决办法吗php或任何其他方法php or laravel Int
  • 静态方法中的继承

    为什么下面的代码打印 Main public class Main public static void method System out println Main public static void main String args
  • 蛮力魔方

    基本上我有一个 3 x 3 网格 其中填充了两位数字 00 99 其中一些数字作为输入给出 其余数字未知 关于如何用 C 语言暴力解决此类问题 有哪些建议 EDIT 抱歉我忘记了部分问题 每行 每列和对角线的总和必须相同 我不需要任何代码
  • 在nodejs中运行mocha测试用例时出现内存不足异常

    对于单元测试我正在使用mocha最近我正在观察out of memory exception运行测试用例时 Last few GCs gt 548213 ms Scavenge 1365 3 1457 7 gt 1365 3 1457 7
  • React-google-chart 不占用选项

    我在用react google chart为了以图形形式 条形图 显示我的数据 根据要求我必须制作一个dual y axis chart 我已经制作了该图表 但问题是该图表没有占据options 它是一个Bar当我将图表作为ColumnCh
  • 如何在CRM插件中获取当前用户记录?

    我正在开发一个插件 每当调用插件时 我需要获取当前用户信息 有什么办法可以找回它吗 该信息可在 PluginExecutionContext 中找到 下面的代码来自您的插件必须实现的 Execute 方法 public void Execu
  • 如何在 Android 版 Chrome 中强制硬重新加载

    在桌面版 Chrome 中 我可以在开发工具中选择在打开开发工具时完全禁用缓存 并且可以选择在长按重新加载按钮时手动执行硬重新加载 在开发工具打开的情况下 Android 版 Chrome 有这样的技术吗 我没有找到任何设置 当我在开发时想
  • 为 Android 构建内核模块

    我需要将 FTDI USB 模块添加到 Android 内核 Android 2 3 1 Linux 2 6 32 因此我获得了 2 6 32 内核并尝试构建该模块 make modules ARCH arm CROSS COMPILE a
  • 将 PowerShell 变量传递到脚本块

    我正在尝试获取 PowerShell 变量并将它们应用到脚本块 param string username throw Blackberry Admin User Name is required string password throw
  • PostgreSQL 使用 tf-idf 吗?

    我想知道 PostgreSQL 9 3 中使用 GIN GiST 索引的全文搜索是否使用 tf idf 术语频率 逆文档频率 特别是 在我的短语列中 我有一些更受欢迎的单词 而有些则非常独特 即名称 我想对这些列建立索引 以便匹配的唯一单词
  • django.db.utils.InternalError:(1050,“表'django_content_type'已经存在”)

    django db utils InternalError 1050 表 django content type 已经存在 我刚刚从我的朋友那里复制了一个项目 当我运行 makemirations 时它运行正常 但对于 python3 ma
  • 将元素添加到对象数组中

    我有一堂课叫receipt其中一个属性是一个数组item items 我有一个方法addItem string name int quantity double price 我的问题是如何将这些参数添加到数组中items 那么如何检查数量是
  • jQuery 从 Google 标签管理器加载到 gtm.js

    我遇到了一个问题 jQuery v1 9 1 被包含在 gtm js 文件的顶部 它会导致一些问题 并且可能会破坏已经加载到 jQuery fn 上的 jQuery 插件 回归测试也是一个问题 我检查了一下 在加载 jQuery 的 Goo
  • SQL*Plus :强制它返回错误代码

    我有一个存储过程 它有一个 OUT 参数 指示错误代码 如果错误代码不为 0 那么我会提出错误 DECLARE BEGIN foo err code IF err code lt gt 0 THEN raise application er
  • LINQ-to-Entities(不是 Linq-to-SQL)中是否有 DataContext?

    我最近问了一个关于跟踪 Linq to Entity 的问题 https stackoverflow com questions 137712 sql tracing linq to entities 我觉得答案之一 https stack
  • 当表中不存在列时如何将 paginate() 与having() 子句一起使用

    我有一个棘手的案例 以下数据库查询不起作用 DB table posts gt select posts DB raw haversineSQL as distance gt having distance lt distance gt p
  • Java 8 中多重继承的用法

    Am I usingJava 8 的一个功能或misusing it 请参阅下面的代码和解释以了解为什么选择这样 public interface Drawable public void compileProgram public Pro
  • 线程编程中的守护简单列表?

    我正在阅读一本 POSIX 线程书籍进行一些练习 并且我试图找出在一个简单的单链表中需要互斥锁的位置作为一个小练习问题 例如 如果我有一个节点结构列表 template