阿里-测试开发面经(七)

共 4179字,需浏览 9分钟

 ·

2021-05-02 11:36

点击蓝字关注我们,获取更多面经








线程之间通信方式




多线程通信的方法主要有以下三种:

1.全局变量

进程中的线程间内存共享,这是比较常用的通信方式和交互方式。

注:定义全局变量时最好使用volatile来定义,以防编译器对此变量进行优化。


2.message消息机制

常用的message通信的接口主要有两个:postmessage和postthreadmessage,

postmessage为线程向主窗口发送消息。而postthreadmessage是任意两个线程之间的通信接口。


2.1.postmessage()

函数原型:

    b00l postmessage(hwnd hwnd,uint msg,wparam wparam,lparam lparam);


参数:

    hwnd:其窗口程序接收消息的窗口的句柄。可取有特定含义的两个值:

    hwnd.broadcast:消息被寄送到系统的所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口

和弹出式窗口。消息不被寄送到子窗口。

    null:此函数的操作和调用参数dwthread设置为当前线程的标识符postthreadmessage函数一样。

    msg:指定被寄送的消息。

    wparam:指定附加的消息特定的信息。

    iparam:指定附加的消息特定的信息。

    返回值:如果函数调用成功,返回非零值:如果函数调用失败,返回值是零。

ms还提供了sendmessage方法进行消息间通讯,sendmessage(),他和postmessage的区别是:

sendmessage是同步的,而postmessage是异步的。sendmessage必须等发送的消息执行之后,才返回。


2.2.postthreadmessage()

postthreadmessage方法可以将消息发送到指定线程。

函数原型:bool postthreadmessage(dword idthread,uint msg,wparam wparam, lparam lparam);

参数除了threadid之外,基本和postmessage相同。

目标线程通过getmessage()方法来接受消息。

注:使用这个方法时,目标线程必须已经有自己的消息队列。否则会返回error_invalid_thread_id错误。可以用

peekmessage()给线程创建消息队列。


3.cevent对象

cevent为mfc中的一个对象,可以通过对cevent的触发状态进行改变,从而实现线程间的通信和同步。






手写sql




某个表格存着 s_name subject score 三个字段,比如某一行是  张三  数学  76,现在要选取出所有科目成绩都大于80分的学生名字

 select s_name from table_name where s_name not in (select s_name from table_name where score <80)






二叉树深度优先遍历




//新建一个类public class BinaryNode {    public int value = 0;    public BinaryNode left;    public BinaryNode right;

public BinaryNode(int value) { this.value = value; }}

//生成二叉树方法public class BinaryTreeUtils {

public static void createBinaryTree(BinaryNode root, int[] array) { root.value = array.length > 0 ? array[0] : -1; for (int i = 1; i < array.length; i++) { insertBinaryTreeNode(root, array[i]); } }



private static void insertBinaryTreeNode(BinaryNode root, int value) { if (root.value >= value) { if (root.left == null) { root.left = new BinaryNode(value); return; } else { insertBinaryTreeNode(root.left, value); }

} else { if (root.right == null) { root.right = new BinaryNode(value); return; } else { insertBinaryTreeNode(root.right, value); }        }
}

}

//深度优先遍历 public static void printBinaryTreeDepthFirst(BinaryNode root) { Stack stack = new Stack(); stack.push(root); while (!stack.isEmpty()) { root = (BinaryNode) stack.pop(); System.out.print(root.value + " "); if (root.right != null) { stack.push(root.right); } if (root.left != null) { stack.push(root.left); } }
}






left join 和right join区别




第一张表命名为kemu,第二张表命名为score:


kemu表


score表


一、left join

顾名思义,就是“左连接”,表1左连接表2,以左为主,表示以表1为主,关联上表2的数据,查出来的结果显示左边的所有数据,然后右边显示的是和左边有交集部分的数据。如下:

select   * from  kemu  left join score on kemu.id = score.id

结果集:



二、right join

“右连接”,表1右连接表2,以右为主,表示以表2为主,关联查询表1的数据,查出表2所有数据以及表1和表2有交集的数据,如下:

select   * from kemu right join score on kemu.id = score.id

结果集:


三、join

join,其实就是“inner join”,为了简写才写成join,两个是表示一个的,内连接,表示以两个表的交集为主,查出来是两个表有交集的部分,其余没有关联就不额外显示出来,这个用的情况也是挺多的,如下

select   * from kemu join score on kemu.id = score.id

结果集:






get和post区别




1.GET:一般用于信息获取,使用URL传递参数,对所发送信息的数量也有限制,一般在2000个字符

2.GET:传送的数据量较小,不能大于2KB。post 传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。用IIS过滤器的只接受get参数,所以一般大型搜索引擎都是用get方式

3.GET:是从服务器上获取数据,post 是向服务器传送数据。get 请求返回 request – URI 所指出的任意信息。

4.GET:是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址,用户看不到这个过程。

5.POST:一般用于修改服务器上的资源,对所发送的信息没有限制。

6.GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值,也就是说Get是通过地址栏来传值,而Post是通过提交表单来传值。








更多面经





360-测试开发面经(一)


百度-测试开发面经(一)


字节跳动-测试开发面经(一)


    扫描二维码

   获取更多面经

  扶摇就业  


浏览 43
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报