今天爱奇艺最后一道多线程怎么写呢?

原程序是吧 main 函数也给出来了,但是如果不修改 main 函数怎么弄呢?我先拿我的代码抛砖引玉吧,bug 是有一定的几率会死锁

本来是可以用信号量的,但是遗憾的是 C++ 11 没有信号量,而我对 Linux C 又不熟悉,所以用的条件变量。

发生死锁的时候屏幕没有任何输出,所以我也不知道到底是那里出了问题

#include <semaphore.h>
#include <time.h>
#include <algorithm>
#include <atomic>
#include <condition_variable>
#include <iostream>
#include <memory>
#include <mutex>
#include <thread>

using namespace std;

class Foo {
    atomic_bool        flag { false };
    mutex              mu0;
    mutex              mu1;
    mutex              mu2;
    unique_lock<mutex> pt1 { mu0 };
    unique_lock<mutex> pt2 { mu1 };
    unique_lock<mutex> pt3 { mu2 };
    condition_variable fir;
    condition_variable sec;
    condition_variable th;

public:
    Foo() { }
    void first() {
        std::cout << "first";
        sec.notify_one();
    }
    void second() {
        sec.wait(pt2);
        std::cout << "second";
        th.notify_one();
    }
    void third() {
        th.wait(pt3);
        std::cout << "third";
    }
};

int main(int argc, char** argv) {
    int array[3] = { 1, 3, 2 };
    ::srand((unsigned)time(NULL));
    std::random_shuffle(array, array + 3);

    std::thread          th1, th2, th3;
    std::unique_ptr<Foo> foo(new Foo());
    for(int i: array) {
        switch(i) {
            case 1: th1 = std::thread(&Foo::first, foo.get()); break;
            case 2: th2 = std::thread(&Foo::second, foo.get()); break;
            case 3: th3 = std::thread(&Foo::third, foo.get()); break;
            default: break;
        }
    }
    th1.join();
    th2.join();
    th3.join();

    std::cout << std::endl;
    return 0;
}
#爱奇艺##笔经#
全部评论
也可以试试《去哪儿网》哈! 校招内推,这两天在发放笔试了 推荐链接:https://www.nowcoder.com/discuss/732239
点赞 回复 分享
发布于 2021-09-12 19:25
这个题leetcode 1114
点赞 回复 分享
发布于 2021-09-12 19:40
我用了Java的公平锁😂
点赞 回复 分享
发布于 2021-09-13 08:55

相关推荐

球球别再泡了:坏,我单9要了14
点赞 评论 收藏
分享
点赞 1 评论
分享
牛客网
牛客企业服务