在 pthread 中实现 FIFO 互斥体

2024-03-18

我正在尝试实现支持并发插入的二叉树(甚至可能在节点之间发生),但不必为每个节点分配全局锁或单独的互斥体。相反,分配的此类锁的数量应按线程数量使用树。

因此,我最终得到了一种锁车队 http://en.wikipedia.org/wiki/Lock_convoy问题。解释得更简单一点就是潜在地当两个或多个线程执行以下操作时会发生:



1 for(;;) {
2   lock(mutex)
3   do_stuff
4   unlock(mutex)
5 }
  

也就是说,如果 Thread#1 在一次“CPU 突发”中执行指令 4->5->1->2,那么 Thread#2 就会因执行而陷入饥饿状态。

另一方面,如果有一个 FIFO 类型的锁定选项mutexes在pthreads中,这样的问题就可以避免。那么,有没有办法在pthreads中实现FIFO类型的互斥锁呢?改变线程优先级可以实现这一点吗?


您可以实现一个公平的排队系统,其中每个线程在阻塞时都会添加到队列中,并且队列中的第一个线程始终在资源可用时获取资源。这种基于 pthreads 原语构建的“公平”票证锁可能如下所示:

#include <pthread.h>

typedef struct ticket_lock {
    pthread_cond_t cond;
    pthread_mutex_t mutex;
    unsigned long queue_head, queue_tail;
} ticket_lock_t;

#define TICKET_LOCK_INITIALIZER { PTHREAD_COND_INITIALIZER, PTHREAD_MUTEX_INITIALIZER }

void ticket_lock(ticket_lock_t *ticket)
{
    unsigned long queue_me;

    pthread_mutex_lock(&ticket->mutex);
    queue_me = ticket->queue_tail++;
    while (queue_me != ticket->queue_head)
    {
        pthread_cond_wait(&ticket->cond, &ticket->mutex);
    }
    pthread_mutex_unlock(&ticket->mutex);
}

void ticket_unlock(ticket_lock_t *ticket)
{
    pthread_mutex_lock(&ticket->mutex);
    ticket->queue_head++;
    pthread_cond_broadcast(&ticket->cond);
    pthread_mutex_unlock(&ticket->mutex);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 pthread 中实现 FIFO 互斥体 的相关文章

随机推荐

  • 使用 C# 在 asp.net 中排序列表和下拉列表

    我有一个返回排序列表的方法 我想将其数据源到下拉列表 我在用 DropDownList1 DataSource stList DropDownList1 DataValueField stList ContainsValue DropDow
  • Haskell:针对 Hackage 的多个版本的基础测试包

    我正在尝试将我的第一个包上传到 Hackage 耶 但出现以下错误 依赖项 build depends base 未指定版本号的上限 基础 包的每个主要版本都会以各种方式更改 API 并且大多数包都需要进行一些更改才能与其一起编译 推荐的做
  • Flutter更新BottomNavigationBar

    我将 BottomNavigationBar 与 TabController 一起使用 通过单击 BottomNavigationBar 的不同选项卡 TabView 会更改内容 但是 如果我在 TabView 上滑动以切换到另一个视图 选
  • 如何使用 C# xaml 以编程方式设置数据绑定

    如何以编程方式设置 DataContext 并在 C Xaml 中创建数据绑定 给定一个类 class Boat INotifyPropertyChanged public event PropertyChangedEventHandler
  • npm 错误!网络 getaddrinfo ENOTFOUND

    我正进入 状态npm ERR network getaddrinfo ENOTFOUND尝试使用 NPM 安装任何包时出错 我知道有很多关于同一问题的线程 但我找不到任何可以帮助我的线程 我已经设置了代理 我认为这与代理设置不正确 没有使用
  • 将 pandas.DataFrame 添加到现有 Excel 文件

    我有一个网络抓取工具 可以为本月的抓取创建一个 Excel 文件 我想在每次运行时将今天的刮擦和该月的每次刮擦添加到该文件中作为新工作表 然而 我的问题是 它仅用新工作表覆盖现有工作表 而不是将其添加为单独的新工作表 我尝试使用 xlrd
  • Hibernate 延迟加载问题

    我在 Hibernate 5 中映射了这个实体 class A private String code private B child LazyToOne LazyToOneOption PROXY ManyToOne fetch Fetc
  • 在不使用cocoapods的情况下向现有项目添加框架

    我有一个现有项目 我想在其中添加名为 CoreActionSheetPicker 的框架 https github com skywinder ActionSheetPicker 3 0 问题是我似乎无法将框架添加到我的项目中 当我将框架拉
  • 如何在 Java 中生成没有按键代码的键盘事件?

    我使用 Robot 类和 KeyEvent 按键代码来生成所有其他按键事件 它们工作正常 但我还需要 Hangul 键 切换韩语键盘 显然 KeyEvent 没有这个键的键码 所以我被卡住了 有没有办法生成这个韩文键事件 有没有办法使用 W
  • Angular2:使用 DynamicComponentLoader 动态插入组件上的双向数据绑定

    我正在开发 Angular2 应用程序 遇到一个问题 我有一组可以使用 UI 选择的不同对象 每个对象都有一组可以使用 UI 进行编辑的选项 不同对象不同 现在 我使用 DynamicComponentLoader 为当前选定的对象插入特定
  • Git 中可以使用特殊字符吗?

    我真的很高兴我修复了 Rails 代码中的这个愚蠢的错误 并且很高兴地在终端中输入了以下内容 git add git commit am Finally fixed that difficult bug 才发现git不喜欢 有谁知道我可以将
  • Python Pandas Concat“WHERE”满足条件

    如何 连接 许多 Python Pandas 数据帧中的特定列 其中许多数据帧中每个数据帧中的另一列满足特定条件 此处通俗地称为条件 X 在 SQL 中 使用 JOIN 子句和 WHERE df2 Col2 X 和 df3 Col2 X 和
  • 是否对破折号进行编码

    我正在尝试在我的 Phonegap Android 应用程序中使用 Google Analytics 我按照这个仓库中的说明进行操作 https github com DoersGuild Cordova Android Analytics
  • 如何检查两个 Map 对象是否相等?

    我如何检查是否有两个ES2015 地图 https developer mozilla org en US docs Web JavaScript Reference Global Objects Map对象具有相同的集合 key valu
  • 我如何在学说上使用“外键”?

    我正在 symfony2 和原则上制作课程管理系统 我对在学说中使用外键感到困惑 实体 用户 php class User extends BaseUser ORM Id ORM Column type integer ORM Genera
  • 是否可以通过 smtp 通过 bash 脚本发送邮件?

    我有postfix dovecot 我想制作可以使用 SMTP 的 bash 脚本 我不想使用sendmail 是否可以 也许有人有一些代码示例 男孩 当挑战被抛出时 它总是bash就在我的头顶上 bin sh function check
  • 是否需要锁定对 bool 的访问,或者是否过度杀伤力

    我有一个主要设计为 POCO 类的类 具有各种线程和任务可以读取其值 只有其他人偶尔会更新这些值 这似乎是 ReaderWriterLockSlim 的理想场景 问题是 在类中 如果需要线程安全的属性 如果该属性是bool 是不是有点大材小
  • 窗口上的代理

    我想设立一个Proxy当定义了新属性时它会警告我window目的 实际上我想捕获所有全局变量声明 let handler defineProperty target key descriptor console log hey key re
  • 如何在 w3m 终端中使用 Javascript?

    我发现文本浏览器 w3m 在我看来是迄今为止最好的 然而 主要问题是Javascript 当我使用 Stackoverflow 时 我根本看不到评论 我不确定让 Javascript 在终端中存在什么限制 如何为终端启用至少部分 JavaS
  • 在 pthread 中实现 FIFO 互斥体

    我正在尝试实现支持并发插入的二叉树 甚至可能在节点之间发生 但不必为每个节点分配全局锁或单独的互斥体 相反 分配的此类锁的数量应按线程数量使用树 因此 我最终得到了一种锁车队 http en wikipedia org wiki Lock