转眼间已毕业三年,在武汉找工作还是有点艰辛的,所以也导致自己积累了一些面试经验,好了,废话少说,我们进入正题,如有问题,希望大家指出。
1.多线程的同步。
通常面试中常会涉及到多线程,那么什么是多线程的同步和异步了?网上很多blog写的很书面,个人觉得很虚。
线程的同步:相当于多个线程去同时访问同一块资源,但是每次只能有一个线程去访问,也就是会阻塞。解决线程同步的方法有(这也是常问的):互斥锁,信号处理,条件变量。
下面我给大家看个简单的同步的例子:
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
void *test(void *b)
{
b = (char*)b;
printf("b = %s\n", b);
pthread_exit(NULL);
}
int main()
{
int i = 0;
pthread_t tid;
while(i < 4)
{
void *a = "test";
pthread_create(&tid, NULL, test, a);
i++;
}
sleep(2);
return 0;
}
结果是:4个b = test,因为四个线程都会去访问test函数,期间会产生同步,这里我并没有进行同步的处理,如果遇到全局变量就需要用到上述方法,大家可能会问为什么要加个sleep(2),如果不加这个,并不能保证4个线程会创建,有可能是2,3,4所以创建线程,一定要保证不能在创建时,主程序已经退出了。
socket通信:
这也是面试常见的问题,面试者最起码要知道基本流程:
服务器:
1.创建一个socket
2.bind一个句柄(端口和地址)
3.listen设置监听的客户数
4.accept客户端的句柄
5.读写。
客户机:
1.创建一个socket
2.connect到服务器
3.读写操作。
socket通信又会涉及到阻塞和非阻塞的方式。这个大家去研究,我研究比较多的非阻塞就是select。
线程和进程的区别:
1.进程是系统进行资源分配和调度的一个独立单位。 线程是:是CPU调度和分派的基本单位。
2.线程的开销比进程的开销小。
3.一个进程里面可以创建多个线程。
4.进程是独立的内存单元,线程可以多个线程共享一片资源,提高处理效率。
野指针:指针指向一块不可用的地址。比如:动态分配了一块空间,你free后,没有置为NULL,然后又把指针指向被释放的地址,这就会产生野指针。
进程间的通信方式有哪几种:
管道,信号,socket,共享内存,消息队列
后续再写。