美文网首页
秋招面试&笔试汇总笔记

秋招面试&笔试汇总笔记

作者: 饮茶先啦靓仔 | 来源:发表于2019-10-13 13:43 被阅读0次

TCL通讯:

问 :请设计一段程序,使用三个线程,一个线程对num加一并输出余2后的值,一个线程对num加一并输出余3后的值。一个线程检测num是否大于5,如果大于则关闭所有线程。

C++11提供了多线程和并发编程的支持,但这方面需要的知识我还是需要看看《C++并发编程实战》一书,掌握这方面的能力看来并非易事。
这段程序我个人认为是有问题的,希望路过的大佬们给点意见。题目要求在另一个线程里检测num是否大于5并控制其他线程的关闭,但有两个问题:①在另一个线程中直接控制其他线程的关闭(使用TerminateThread()函数)会让线程立即关闭,会导致内存泄漏和死锁问题,所以这里用的是一个全局的flag标志位去让其他线程自行判断是否应该退出,但符不符合题意是个问题。②因为线程调度由操作系统控制,会出现num等于7或者8的情况线程才全部退出。

/**
 * 华南农业大学 杨帮杰 2019.10.13
 * References:
 * https://www.jianshu.com/p/34d219380d90
 * https://www.cnblogs.com/huty/p/8516997.html
 * https://blog.csdn.net/yimengchenxi/article/details/46691981
 */
#include <iostream>
#include <thread>
#include <mutex>
using namespace std;

volatile int m_num = 0;
volatile bool m_extFlag = false;
mutex mtx;

int main()
{
    thread th1([&] {
        while (m_extFlag !=true)
        {
            //不推荐使用ExitThread()来退出
            //不会调用作用域内类对象的析构函数
            if (m_extFlag == true)
                return;
            //互斥锁的几种用法
            //mtx.lock();
            //unique_lock<mutex> lck(mtx);
            lock_guard<mutex> lck(mtx);
            m_num++;
            cout << "threa1-m_num = " << m_num << endl;
            cout << "m_num % 2 = " << m_num % 2 << endl;
            //mtx.unlock();
        }
    });

    thread th2([&] {
        while (true)
        {
            if (m_extFlag == true)
                return;
            //mtx.lock();
            lock_guard<mutex> lck(mtx);
            m_num++;
            cout << "threa2-m_num = " << m_num << endl;
            cout << "m_num % 3 = " << m_num % 3 << endl;
            //mtx.unlock();

        }
    });

    thread th3([&] {
        //不推荐在其他线程使用TerminateThread()
        //会导致堆栈没有被回收,内存泄漏或死锁
        while (m_num <= 5);
        m_extFlag = true;
    });

    th1.join();
    th2.join();
    th3.join();

    system("pause");
    return 0;
}
num=7时才停下来?

问:以下程序的输出结果如何?

答案是false和true。虽然字符数组和字符指针一定程度上可以互相转换使用,但要意识到这两者其实是两种类型。字符数组在栈区开辟,而拿数组名去比较的时候退化成指针(地址),显然两个字符数组的地址是不一样的。
char* strPointer1 = "abc";这种写法实质在C++11标准是被禁止的,正确的写法是 const char* strPointer1 = "abc";因为"abc"本身是常量。也就是说,使用char* str去指向一个常量的时候,这个变量指向的是常量区。编译器为了优化,指向同样常量的两个char* str指向的内存地址是一样的。

//Reference:https://blog.csdn.net/honyniu/article/details/51323255
#include <iostream>
using namespace std;
int main() {
    char strArray1[] = "abc";
    char strArray2[] = "abc";
    cout << boolalpha << (strArray1 == strArray2) << endl; 

    char* strPointer1 = "abc";
    char* strPointer2 = "abc";
    cout << boolalpha << (strPointer1 == strPointer2 ) << endl;
}

深圳长城开发:

问:请写出一个链表逆序的过程。

https://blog.csdn.net/hbuxiaofei/article/details/36673043

当时傻乎乎地把head指向了NULL,其实应该指向最后一个。

//Reference:https://blog.csdn.net/a1037488611/article/details/40190211
#include "iostream"
using namespace std;
struct ListNode
{
    int data;
    ListNode *next;
};
 
void prt_linked_list(ListNode* head);
ListNode* reverse_linked_list(ListNode* head);
 
void main()
{
    ListNode *head;
    head=new ListNode;
    head->data=-1;
    head->next=NULL;
    int x;
    cin>>x;
    ListNode *p,*q;
    p=head;
    while(x!=-1)
    {
        q=new ListNode;
        q->data=x;
        q->next=NULL;
        p->next=q;
        p=q;
        cin>>x;
    }
    prt_linked_list(head);
    head=reverse_linked_list(head);
    prt_linked_list(head);
}
 
void prt_linked_list(ListNode* head)
{
    ListNode *p;
    p=head->next;
    while(p!=NULL)
    {
        cout<<p->data;
        cout<<" ";
        p=p->next;
    }
}
 
ListNode* reverse_linked_list(ListNode* head)
{
    ListNode *p,*q;
    ListNode *t = NULL;
    p=head;
    if (p->next==NULL||p->next->next==NULL)
    {
        return head;
    }
    p=head->next;
    q=head->next->next;
    while(q!=NULL)
    {
        t=q->next;
        q->next=p;
        p=q;
        q=t;
    }
    head->next->next=NULL;
    head->next=p;
    return head;
}

问:机器视觉系统的主要组成部分有哪些?

工业相机、光源、(触发图像采集的光电传感器)、计算机、图像采集卡、工业相机驱动软件、机器视觉软件算法、PLC/下位机、现场总线(CAN/ModBus等)、执行机构(电机/机械臂等)

机器视觉算法与应用 P2 图

大华:

问:写一段程序,判断计算机是大端还是小端处理器。

可以用一个char*指针来指向一个int变量的方式来判断


大小端区别
#include <iostream>
using namespace std;

int main()
{
    int i = 0x12345678;

    if (*((char*)&i) == 0x12)
        cout << "大端" << endl;
    else    
        cout << "小端" << endl;

    return 0;
}

问:Linux进程一共有几种状态?

一般认为是五种


https://blog.csdn.net/qq_38410730/article/details/81173170
//https://blog.csdn.net/yanlinwang/article/details/8193709
//关于进程的几个状态值在sched.h中定义如下
#define TASK_RUNNING                 0
#define TASK_INTERRUPTIBLE     1
#define TASK_UNINTERRUPTIBLE               2
#define TASK_ZOMBIE                    3
#define TASK_STOPPED                  4

相关文章

网友评论

      本文标题:秋招面试&笔试汇总笔记

      本文链接:https://www.haomeiwen.com/subject/esaapctx.html