【问题标题】:Locks with multiple threads parallel programming in C++C++中多线程并行编程的锁
【发布时间】:2016-12-03 12:02:00
【问题描述】:

如何回答这个问题?请帮忙。

考虑以下具有 3 个线程的程序。

locks l1, l2, l3;

*线程 1

while(1){

l1.lock();

l2.lock();

printf(“Red”);

l3.unlock();

l1.unlock();}

*线程 2

while(1){

l2.lock();

l3.lock();

printf(“Green”);

l1.unlock();

l2.unlock();}

*线程 3

while(1){

l3.lock();

l1.lock();

printf(“Blue”);

l2.unlock();

l3.unlock();}

a) 上述计划的可能结果是什么。你能解释一下这将如何发生吗? b) 这段代码会导致死锁吗?

【问题讨论】:

标签: c++ multithreading parallel-processing locking


【解决方案1】:

这取决于l1.lock()l1.unlock() 等实际执行的操作。由于这是标记为 C++(尽管标题显示为 C),如果这些函数调用正在管理 std::mutex 对象,则结果是未定义的行为,每个线程解锁一个它没有锁定的互斥体。

【讨论】:

  • 很抱歉,因为我对这些内容非常陌生。所以请您再为我解释一下吗?
  • C++ 中互斥锁的规则是,唯一允许解锁互斥锁的线程是锁定它的线程。但既然你已经接受了另一个答案,我认为没有进一步讨论的意义。
  • 我不知道你接受另一个答案是什么意思。我是新来的。但无论如何,如果您能进一步解释一下,这将非常有帮助
  • 那个绿色复选标记(您现在已删除)表示您接受了该答案作为问题的正确解决方案。
【解决方案2】:

为了便于阅读,我将锁称为数组(例如lock[0], lock[1], lock[2]

A) 取决于哪个线程首先开始执行。

  1. 如果线程 1 先启动:红色、蓝色、绿色、红色、蓝色、...
  2. 如果线程 2 先启动:蓝色、绿色、红色、蓝色、绿色……
  3. 如果线程 3 先启动:绿色、红色、蓝色、绿色、红色、...

B) 是的,它可以。它可能会。考虑一下:

  1. 线程 1 锁定 lock[0]
  2. 线程 2 锁定 lock[1]
  3. 线程 3 锁定 lock[2]
  4. 线程1尝试锁定lock[1],等待线程2
  5. 线程 2 尝试锁定 lock[2],等待线程 3
  6. 线程 3 尝试锁定lock[3],等待线程 1

【讨论】:

  • 你能解释一下它是如何在线程之间切换的吗?我不清楚
  • 在真实计算机上,它可能完全随机,因为它完全依赖于调度程序(通常是操作系统的一部分)。真的没什么好说的了,因为现在的计算机是多核的,这意味着线程实际上可以并行运行。
  • 为了进一步阅读,我建议en.m.wikipedia.org/wiki/…>
  • 它太多了:(这个需要专门回答
  • 就像我说的,你应该考虑到线程是无法预测的——只要它还活着,它几乎可以随时执行。例如,您的代码可能会或可能不会陷入死锁,因为如果您的操作系统决定在每个循环(您的代码)中切换线程,它就会正常工作。但是如果操作系统在一个线程只锁定一个互斥锁时切换线程,就会导致死锁。 (要解决这个问题,需要插入一个全局互斥锁,包围锁定两个互斥锁)
最近更新 更多