【问题标题】:Exercise of multithreading多线程练习
【发布时间】:2018-09-08 18:16:31
【问题描述】:

我有这个多线程练习要解决。我必须创建一个类,其中 5 个线程相互等待,当第五个线程到达时,它们都被解锁。 我想使用互斥锁和条件变量,但我不知道我是否很好地使用它们。 我使用 add() 方法创建了一个类,该方法将 variableX 增加 1,创建了一个接收函数 print() 和稍后 join() 它的线程。函数 print() 检查变量 X 是否为 5 的小数,如果是这样,则条件变量等待,否则条件变量使用 notify_all() 函数唤醒所有线程。编译器给出 0 错误,但通过调试,我看到程序陷入死锁。这是一个sn-p

#include "stdafx.h"
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
using namespace std;

void print(mutex & mtx, condition_variable & convar, int x) {
    if (x < 5){
        unique_lock<mutex> lock(mtx); //acquire and lock the mutex
        convar.wait(lock); //unlock mutex and wait
    }
    else {
        convar.notify_all();
        cout << "asdasd" << endl;
    }
}

class foo {
public:
    void add() {
        this->x = x + 1;
        thread t1(print, ref(mtx), ref(cv), x);
        t1.join();
    }

private:
    mutex mtx;
    condition_variable cv;
    int x;
};

int main() {
    foo f;
    f.add();
    f.add();
    f.add();
    f.add();
    f.add();
}

【问题讨论】:

  • this-&gt;x = x + 1; 有点奇怪。 x 最初是如何获得价值的?
  • 问题是什么?

标签: c++ multithreading mutex condition-variable


【解决方案1】:

你的功能

void add() {
    this->x = x + 1;
    thread t1(print, ref(mtx), ref(cv), x);
    t1.join();
}

创建一个线程,然后等待 (join()) 直到线程结束。由于你的线程函数

void print(mutex & mtx, condition_variable & convar, int x) {
    if (x < 5){
        unique_lock<mutex> lock(mtx);
        convar.wait(lock); // waits if x < 5
    }
    // ...

并且x 是可推测的(你确实未能初始化它)

#include <iostream>
#include <thread>
#include <mutex>
#include <vector>
#include <condition_variable>
using namespace std;

void print(mutex & mtx, condition_variable & convar, int x)
{
    if (x < 5) {
        unique_lock<mutex> lock{ mtx };
        convar.wait(lock);
    } else {
        convar.notify_all();
        cout << "asdasd\n";
    }
}

class foo {
private:
    mutex mtx;
    condition_variable cv;
    int x{ 0 };
    std::vector<thread> threads;
public:
    void add() {
        ++x;
        threads.push_back(thread(print, ref(mtx), ref(cv), x));
    }

    ~foo() {
        for (auto &t : threads)
            t.join();
    }
};

int main() {
    foo f;
    f.add();
    f.add();
    f.add();
    f.add();
    f.add();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    相关资源
    最近更新 更多