互斥问题

2023-12-12

请看一下下面的伪代码:

boolean blocked[2];
int turn;
void P(int id) {
      while(true) {
             blocked[id] = true;
             while(turn != id) {
                    while(blocked[1-id])
                    /* do nothing */;
                    turn = id;
             }
             /* critical section */
             blocked[id] = false;
             /* remainder */
      }
}
void main() {
      blocked[0] = false;
      blocked[1] = false;
      turn = 0;
      parbegin(P(0), P(1)); //RUN P0 and P1 parallel
}

我认为可以使用上面的代码实现一个简单的互斥解决方案。但这不起作用。有谁知道为什么吗?

任何帮助将不胜感激!


由于以下原因,本示例中不能保证互斥:

我们从以下情况开始:

blocked = {false, false};
turn = 0;

P1 现在执行,并跳过

  blocked[id] = false; // Not yet executed.

现在的情况是:

blocked {false, true}
turn = 0;

现在P0执行。它通过了第二个 while 循环,准备执行关键部分。而当P1执行时,将turn设置为1,也准备好执行临界区。

顺便说一句,这种方法最初是由海曼发明的。 1966 年,他将其发送给 ACM Communications

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

互斥问题 的相关文章

  • 互斥体在释放之前获取锁的问题以及如何平均分配锁?

    方法GetItemSearchResponse将被多个控制台应用程序调用 但我想一一调用这个方法 所以我应用了互斥锁 这样这个方法就会被其他线程锁定 public class AWSItemSearchClient IDisposable
  • PHP 5.x 同步文件访问(无数据库)

    我最熟悉 Java C 和 C 其中有一些方法可以控制在任何给定时间只有一个线程访问资源 现在我正在寻找类似的东西 但在 PHP 5 x 中 用一个例子来阐述我的问题 我有一个 ASCII 文件 它只存储一个数字 即页面加载计数器的值 在应
  • pthread_mutex_lock是如何实现的

    我只是想知道Unix内部如何实现线程间同步相关的功能 例如 当我打电话时会发生什么pthread mutex lock 有使用中的指针吗 参考源代码确实会有帮助 它既复杂又因 Unix 变体而异 例如 在 Linux 中 使用称为 Fute
  • 删除锁定的互斥体

    我有一个包含多个资源的程序 需要通过它们自己的互斥锁来锁定 在这个程序中 可能会发生当 mutex for资源A被锁住了 资源A已在另一个线程中删除 以下代码尝试重现我尝试完成的逻辑 include
  • C++11:为什么 std::condition_variable 使用 std::unique_lock?

    我对角色有点困惑std unique lock当与std condition variable 据我了解文档 http en cppreference com w cpp thread unique lock std unique lock
  • 最快的多读取器/单写入器保护共享资源 - C++

    我想确认我的方法非常fast适用于使用 C 的大多数多读者 单作者方法的共享资源的跨平台保护 它有利于编写者 这样当他们进入时 所有当前线程都可以完成 但任何类型的所有新线程都必须等待 这两个函数的逆向应该是显而易见的 我所做的阅读表明 提
  • 如何在C/c++中设置获取互斥锁的优先级

    我有3个进程 同等优先级 P1 P2 P3 定时器 获取互斥锁的优先级如下 P1 1 priority P2 2 priority P3 timer 3 priority 如果假设p3来获取互斥锁 然后p2来等待互斥体 之后 p1 来了 它
  • std::mutex 的 constexpr 构造函数是如何实现的?

    在查看 C 参考时std mutex https en cppreference com w cpp thread mutex mutex 我注意到构造函数std mutex被标记constexpr 一开始这很令人惊讶 因为我们通常必须进行
  • 为什么 Mutex 被释放后没有被释放?

    我有以下代码 using Mutex mut new Mutex false MUTEX NAME if mut WaitOne new TimeSpan 0 0 30 Some code that deals with a specifi
  • 互斥体名称 - 最佳实践?

    相关这个问题 https stackoverflow com questions 459554 how do i tell if one instance of my program is running 命名互斥体的最佳实践是什么 我意识
  • 进行机器间锁定有哪些好方法?

    我们的服务器集群由 20 台机器组成 每台机器有 10 个 5 个线程的 pid 我们想要某种方法来防止任何机器上任何 pid 中的任何两个线程同时修改同一个对象 我们的代码是用 Python 编写的并在 Linux 上运行 如果这有助于缩
  • 无法锁定 DLL 上的 c++ 11 std::mutex [重复]

    这个问题在这里已经有答案了 我试图通过使用 std lock 对象来防止多次调用 DLL 初始化函数 在独立程序上使用这样的程序时 include
  • 简单数据类型的互斥锁

    我对并发还很陌生 并且在决定如何使用互斥体时遇到困难 目前 它们散布在我的代码中两个线程交互的地方 这种互斥体的使用是否合适 class Foo public void SetMember int n AcquireMutex n n Re
  • 在 pthread 中实现 FIFO 互斥体

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

    我有方法a在某个随机时间重复调用 从而触发方法b 它在一段随机时间后完全执行 并且在它自己的线程中 我想确保随后执行a等到b已完成 由当前执行触发a 换句话说 a and b均须交替执行 我尝试使用互斥体和条件变量来执行此操作 如下所示 d
  • boost share_mutex 的示例(多次读取/一次写入)?

    我有一个多线程应用程序 必须经常读取一些数据 并且偶尔会更新数据 现在 互斥体可以安全地访问该数据 但它很昂贵 因为我希望多个线程能够同时读取 并且仅在需要更新时将它们锁定 更新线程可以等待其他线程完成 我想这就是boost shared
  • 在并发读取中是否使用互斥体

    我正在 Linux 中使用 C 进行编程 并且使用 pthreads 库 我正在使用互斥体来保护一些共享变量 但我不确定在这种特定情况下是否有必要使用互斥体 我有 3 个线程 共享变量是一个字符串 全局变量 线程1更改它的值 然后线程2和线
  • 使用易失性变量和信号量 - Java

    我从线程 信号量 易失变量等开始 我想知道当我使用信号量时是否有必要将变量定义为易失性 我的意思是 有 2 个线程 一个增加变量 另一个减少变量 例如 显然 在每次访问之前 我有一个互斥体 它随时控制只有一个线程正在 玩 变量 有必要定义为
  • std::mutex 和 std::shared_mutex 之间的区别

    我遇到了一个std shared mutex in C 17 到底是什么std shared mutex以及它有何不同std mutex 如中所述文档 http en cppreference com w cpp thread shared
  • 如何在不饥饿的情况下锁定 std::mutex

    在我的程序中 我有一个互斥体和两个线程 这些线程之一经常获取锁 另一个线程尝试获取但必须永远等待 难道释放锁后获取锁的速度太快 以至于其他线程没有机会获得锁 互斥体总是给每个人一个机会吗 如果没有 什么是一个好的解决方案 某种 FIFO 锁

随机推荐