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届秋招笔面经#
查看15道真题和解析