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

原程序是吧 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

相关推荐

整体面试流程比较顺利,两面都是一个小时时间,面试体验很好,就是等&nbsp;offer&nbsp;等好久。一面:有两个面试官,旁听的就问了下实习。问的挺深入的,面试官一直在问我比较擅长什么,他就问些相关的问题。1.&nbsp;自我介绍2.&nbsp;拷打项目3.&nbsp;atomic&nbsp;是怎么保证原子性的4.&nbsp;线程是为了解决什么问题5.&nbsp;线程共享哪些资源6.&nbsp;线程的独立的寄存器是怎么理解的7.&nbsp;QUIC&nbsp;了解过吗8.&nbsp;介绍下拥塞控制9.&nbsp;C++&nbsp;内存布局10.&nbsp;malloc&nbsp;和&nbsp;new&nbsp;的区别11.&nbsp;定位&nbsp;new&nbsp;了解过吗12.&nbsp;new&nbsp;内部调用的是什么系统调用13.&nbsp;介绍下智能指针14.&nbsp;shared_ptr&nbsp;计数是怎么共享的,怎么解决并发问题的15.&nbsp;介绍下左值和右值16.&nbsp;虚左值、虚右值、从右值了解过吗17.&nbsp;move&nbsp;是怎么实现的18.&nbsp;move&nbsp;是为了解决什么问题,怎么解决的19.&nbsp;实习经历20.&nbsp;算法题:分割回文串二面:直接到主管面了,不清楚为什么,一面时候问说有三面。问的都是些开放性的问题,面试过程中不会的地方会给一些提示,实在没什么思路就换题了,学到了很多。1.&nbsp;自我介绍2.&nbsp;拷打项目3.&nbsp;设计&nbsp;Log&nbsp;系统,程序崩溃时&nbsp;Log&nbsp;文件保留,要求只要执行相应函数打了日志就必须存在,但又对性能要求很高不能每次写都调用&nbsp;sync4.&nbsp;100MB&nbsp;文件传递,用互联网传,怎么比&nbsp;TCP&nbsp;更快5.&nbsp;设计内存池,用来解决内存碎片问题6.&nbsp;.so&nbsp;文件操作系统是怎么加载的
点赞 评论 收藏
转发
点赞 1 评论
分享
牛客网
牛客企业服务