在C ++中使用多线程并行编程锁定

时间:2016-12-03 12:02:01

标签: c++ multithreading parallel-processing locking

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

考虑使用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)此代码是否会导致死锁?

2 个答案:

答案 0 :(得分:1)

具体取决于l1.lock()l1.unlock()等。由于这是标记的C ++(虽然标题是C),如果这些函数调用是管理std::mutex个对象,结果是未定义的行为,每个线程解锁一个它没有锁定的互斥锁。

答案 1 :(得分:0)

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

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

  1. 如果第一个线程1开始:红色,蓝色,绿色,红色,蓝色......
  2. 如果第一个线程2开始:蓝色,绿色,红色,蓝色,绿色......
  3. 如果第3个线程首先开始:绿色,红色,蓝色,绿色,红色......
  4. 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