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

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(使用前将#替换为@)

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

  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么

随机推荐

  • 如何使用 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