互斥问题

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

互斥问题 的相关文章

  • 删除锁定的互斥体

    我有一个包含多个资源的程序 需要通过它们自己的互斥锁来锁定 在这个程序中 可能会发生当 mutex for资源A被锁住了 资源A已在另一个线程中删除 以下代码尝试重现我尝试完成的逻辑 include
  • 如何绕过分配将锁定值复制到 tr: net/http.Transport containssync.Mutex

    当我跑步时go vet输出以下错误 client go 2345 assignment copies lock value to tr net http Transport contains sync Mutex exit status 1
  • std::mutex 的 constexpr 构造函数是如何实现的?

    在查看 C 参考时std mutex https en cppreference com w cpp thread mutex mutex 我注意到构造函数std mutex被标记constexpr 一开始这很令人惊讶 因为我们通常必须进行
  • 互斥体是否保证获取的顺序?解锁线程在其他线程仍在等待时再次获取它

    一位同事最近遇到了一个问题 我们认为该问题归结为具有两个线程的 C 应用程序中的以下事件序列 线程 A 持有一个互斥锁 当线程 A 持有互斥锁时 线程 B 尝试锁定它 由于它被持有 线程 B 被挂起 线程 A 完成了它持有互斥锁的工作 从而
  • 为什么 Mutex 被释放后没有被释放?

    我有以下代码 using Mutex mut new Mutex false MUTEX NAME if mut WaitOne new TimeSpan 0 0 30 Some code that deals with a specifi
  • 我是否“不想”使用读/写锁而不是普通互斥锁?

    同步对共享资源的访问时 是否有原因not使用读 写锁而不是普通互斥锁 这基本上只是一个写锁 besides它具有比我可能需要的更多功能的哲学原因 换句话说 如果我只是默认将读 写锁作为我首选的同步结构 我是否会搬起石头砸自己的脚 在我看来
  • 进行机器间锁定有哪些好方法?

    我们的服务器集群由 20 台机器组成 每台机器有 10 个 5 个线程的 pid 我们想要某种方法来防止任何机器上任何 pid 中的任何两个线程同时修改同一个对象 我们的代码是用 Python 编写的并在 Linux 上运行 如果这有助于缩
  • thrd_busy 和 mtx_lock()/mtx_timedlock()

    我对 C1x 互斥体有以下问题 7 25 4 哪些情况可以mtx lock return thrd busy而不是阻塞 哪些情况可以mtx timedlock return thrd busy 注意thrd busy在 7 25 1 5 中
  • boost share_mutex 的示例(多次读取/一次写入)?

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

    所以我有一些shared mutex并这样做了 boost upgrade lock
  • 是否可以在Java中有效地实现seqlock?

    Another question https stackoverflow com q 14660529 149138让我想知道是否seqlock http en wikipedia org wiki Seqlock可以通过Java中的易失性
  • C++:防止多个函数同时执行

    我问这个问题是因为mutex我发现文档处理单个函数 我认为我的情况很常见 我的问题是以下代码是否不仅会阻止func1 OR func2 并行执行多次 但它是否也会阻止func1 AND func2 同时执行 include
  • 使用易失性变量和信号量 - Java

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

    我正在尝试使用 boost shared mutex 来实现多读取器 单写入器互斥体 我的问题相当简单 当另一个线程尝试锁定共享互斥体进行写入时 线程是否有可能获得对共享互斥体的读取器访问权限 例如 我有10个线程 只有其中一个可以写 线程
  • C++ 类的互斥成员导致编译错误

    我不确定为什么当我向 myClass 添加互斥体成员时会发生这种情况 在本例中为 mu Error C2661 std tuple lt void thiscall MyNameSpace myClass void MyNameSpace
  • Android NDK 互斥锁

    我一直在将跨平台 C 引擎移植到 Android 并注意到它在调用时会莫名其妙地 并且不一致地 阻塞pthread 互斥锁 这个引擎已经在多个平台上运行了很多年 并且有问题的代码多年来没有改变 所以我怀疑这是一个死锁或其他有错误的代码 这一
  • 如何避免 Java 中的忙旋转

    我有一个多线程应用程序 其中一个线程向另一个线程发送消息 等待线程轮询消息并做出反应 处理锁 像这样 等待线程代码 while true if helloArrived System out println Got hello if bye
  • 使用 std::mutex 实现类的交换

    假设我们有一个class with a std mutex class Foo std mutex mutex std string str other members etc public friend void swap Foo lhs
  • 类和互斥体

    假设我有一个类代表一些名为 foo 的数据结构 class foo public foo attr01 0 void f attr01 5 private int attr01 class fooSingleThreadUserClass
  • 如何在 Linux 和 C 中使用文件作为互斥体?

    我有不同的进程同时访问 Linux 中的命名管道 并且我想让此访问互斥 我知道可以使用放置在共享内存区域中的互斥体来实现这一点 但作为一种家庭作业 我有一些限制 于是 我想到的是对文件使用锁定原语来实现互斥 我做了一些尝试 但无法使其发挥作

随机推荐