当前位置: 首页 > 面试经验 >

2022-09-13-算力/比特大陆-应用软件

优质
小牛编辑
139浏览
2023-03-28

2022-09-13-算力/比特大陆-应用软件

26分钟,15个不定项,3题编程

用户线程调度由在用户空间实现的线程库实现 (对)

const char* n="ABC";
    n[2]='k';
    *n='k';
    *(n+2)='k';
    n="abc";

只有第四个对

在函数体内,静态变量只初始化一次,并且在函数被调用过程中维持其值不变。(对)
在模块内,静态函数只可被本模块内其他函数调用,即在当前文件中、在声明它的模块的本地范围内使用(对)
在模块内函数体外,静态变量可以被本模块所有函数使用,不能被其他模块的函数使用,是一个本地的全局变量。(对)

364个节点的完全三叉树有几层 (不是满,5层)

// 3min 100% 10'
// 16进制转10进制
// class Solution {
// public:
//     long long convert(string value) {
//         long long a = 0, t = 1;
//         for(int i=value.length()-1;i>=0;i--){
//             char c = tolower(value[i]);
//             int d=0;
//             if(isdigit(c)){
//                 d=c-'0';
//             }else{
//                 d=10+c-'a';
//             }
//             a=a+d*t;
//             t=t*16;
//         }
//         return a;
//     }
// };

// 3min 100% 10'
// class Solution {
// public:
//     // 给一个链表,删除链表倒数第n个节点,返回头节点,n保证有效,只扫描链表一次实现
//     vector<int> process(vector<int>& arr, int n) {
//         vector<int> a;
//         for(int i=0;i<arr.size();i++){
//             if(i!=arr.size()-n)
//                 a.push_back(arr[i]);
//         }
//         return a;
//     }
// };



// 设计一个可产生死锁的程序,写出详细代码注释 20' 7min
// #include<thread>
// mutex m[2];

// void f1(int&mark){
//     if(mark==0){
//         // try to lock m[0]
//         safe_lock(m[0]);
//         mark=1;
//     }
//     while(mark!=2){}
//     // try to lock m[1]
// }

// void f2(int&mark){
//     while(mark!=1){}
//     // try to lock m[1]
//     safe_lock(m[1]);
//     mark=2;
//     // try to lock m[0]
// }

// int main(){
//     thread* t1, t2;
//     int mark=0;
//     // t1 运行 f1()
//     t1=new thread(f1,mark);
//     // t2 运行 f2()
//     t2=new thread(f2,mark);
//     return 0;
// }


// 更正:
#include <thread>
#include <mutex>
using namespace std;

mutex m[2];

void f1(int &mark)
{
    std::unique_lock<std::mutex> munique1(m[0], std::defer_lock); // 延迟加锁
    std::unique_lock<std::mutex> munique2(m[1], std::defer_lock);
    if (mark == 0)
    {
        // try to lock m[0]
        // lock_guard<mutex> lg1(m[0]); // 不能使用 lock_guard, 因为退出if后就释放了!
        munique1.lock(); // 不是 try_lock,阻塞
        mark = 1;
    }

    while (mark != 2)
    {
    }
    // try to lock m[1]
    // lock_guard<mutex> lg2(m[1]);
    munique2.lock();
    printf("f1 finishes\n");
}

void f2(int &mark)
{
    std::unique_lock<std::mutex> munique1(m[0], std::defer_lock);
    std::unique_lock<std::mutex> munique2(m[1], std::defer_lock);
    while (mark != 1)
    {
    }
    // try to lock m[1]
    // lock_guard<mutex> lg1(m[1]);
    munique2.lock();
    mark = 2;
    // try to lock m[0]
    // lock_guard<mutex> lg2(m[0]);
    munique1.lock();
    printf("f2 finishes\n");
}

int main()
{
    int mark = 0;
    thread t1(f1,ref(mark)), t2(f2,ref(mark));
    t1.join();
    t2.join();
    return 0;
}
#比特大陆##23秋招##应用软件工程师##23届校招##23届秋招笔面经#
 类似资料: