面试常见的问题(多线程同步 socket通信等)

转眼间已毕业三年,在武汉找工作还是有点艰辛的,所以也导致自己积累了一些面试经验,好了,废话少说,我们进入正题,如有问题,希望大家指出。

1.多线程的同步。

通常面试中常会涉及到多线程,那么什么是多线程的同步和异步了?网上很多blog写的很书面,个人觉得很虚。

线程的同步:相当于多个线程去同时访问同一块资源,但是每次只能有一个线程去访问,也就是会阻塞。解决线程同步的方法有(这也是常问的):互斥锁,信号处理,条件变量。

下面我给大家看个简单的同步的例子:

#include
#include
#include

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,共享内存,消息队列

后续再写。


你可能感兴趣的:(面试常见的问题(多线程同步 socket通信等))