1.线程的基本概念 ,线程的基本状态及状态之间的关系

线程:线程有时称为轻量级进程,是 CPU使用的基本单元;它由线程ID,程序计数器,寄存器和堆栈组成

线程的基本状态:新生状态,可运行状态,被阻塞状态,死亡状态;状态之间转化如下

spacer.gifwKioL1fGNTTRiFmXAABtgHAbL9w823.png-wh_50

创建线程,并调用start方法后线程进入就绪状态,线程调度系统将就绪状态转化为运行状态;遇到synchronized语句时,由运行状态转为阻塞状态,当synchronized获得锁后,由阻塞转化为运行

2.多线程同步和互斥有几种方法,都是什么?


线程之间通信涉及到:

(1)线程之间如何传递信息

(2)线程之间如何同步,以使一个线程的活动不会破坏 另一个线程的活动

(3)当线程有依赖关系时,如何调度多个线程的处理顺序 

(4)如何避免死锁问题 


线程间通信方式:

(1)互斥锁:通过锁机制实现线程间的同步,同一时刻只允许一个线程执行一个关键部分的代码

  1. 初始化锁。在Linux下,线程的互斥量数据类型是pthread_mutex_t。在使用前,要对它进行初始化。
    静态分配:pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
    动态分配:int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutex_attr_t *mutexattr);

  2. 加锁。对共享资源的访问,要对互斥量进行加锁,如果互斥量已经上了锁,调用线程会阻塞,直到互斥量被解锁。
    int pthread_mutex_lock(pthread_mutex *mutex);
    int pthread_mutex_trylock(pthread_mutex_t *mutex);

  3. 解锁。在完成了对共享资源的访问后,要对互斥量进行解锁。
    int pthread_mutex_unlock(pthread_mutex_t *mutex);

  4. 销毁锁。锁在是使用完成后,需要进行销毁以释放资源。
    int pthread_mutex_destroy(pthread_mutex *mutex);

(2)条件变量:条件变量是一种同步机制,允许线程挂起,直到共享数据上的某些条件得到满足,条件变量时用来等待的而不是上锁的;条件变量 用来自动阻塞一个线程,直到某特殊情况发生为止。

(3)信号量:如同进程一样,线程也可以通过信号量实现通信,虽然是轻量级的

P:申请资源如果sv的值大于1,就给它减1,如果它的值为0,就挂起该进程

V:临界资源累加,如果其他进程因等待sv被挂起,就让他恢复运行,如果进程没有因等待sv而被挂起,就给他加1

  1. 信号量初始化。
    int sem_init (sem_t *sem , int pshared, unsigned int value);
    这是对由sem指定的信号量进行初始化,设置好它的共享选项(linux 只支持为0,即表示它是当前进程的局部信号量),然后给它一个初始值VALUE。

  2. 等待信号量。给信号量减1,然后等待直到信号量的值大于0。
    int sem_wait(sem_t *sem);

  3. 释放信号量。信号量值加1。并通知其他等待线程。
    int sem_post(sem_t *sem);

  4. 销毁信号量。我们用完信号量后都它进行清理。归还占有的一切资源。
    int sem_destroy(sem_t *sem);

4.多线程的同步与互斥有何异同,什么情况下分别使用他们?


线程同步是指线程之间具有一种制约关系,一个线程的执行依赖于另一个线程的消息,当它没有得到另一个线程的消息是应等待,直到消息到达时才被唤醒;


线程互斥 是对共享的进程系统资源,在各个单线程访问时的排他性,若有若干个线程都要使用某一共享资源。任何时刻最多只允许一个线程去使用它,其他使用该资源的线程必须等待,直到占用资源者释放该资源,,线程互斥可以看做一种特殊的线程同步;

5.线程与进程的区别?

联系 :

一个线程 可以创建和撤销另一个线程;同一进程中的多个线程可以并发执行;线程可以与 同进程的其他线程共享数据 ,但拥有自己的栈空间 ,拥有独立运行的序列。

区别:


进程 和线程的主要区别就是他们是不同的操作系统管理方式。进程拥有 独立的地址空间 ,一个进程奔溃后,在保护模式下不会对其他进程造成影响,线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程没有单独的地址空间,一个线程死掉就等于整个进程死掉。所以多进程的程序要比多线程的程序健壮性高;但是在切换时,资源消耗较大,效率要差一些。但对于要求 同时进行并且共享某些变量的并发操作,只能用现成不能用进程;


总结 :

(1)一个程序至少有一个进程,一个进程至少有一个线程

(2)线程的划分尺度 小于进程,使得多线程程序的并发性高

(3)进程在执行过程中拥有独立的内存单元,而多个线程是共享内存的,极大的提高了程序运行效率

(4)线程在执行过程中每个线程拥有一个程序运行的入口,顺序执行序列和程序出口;但是线程不能独立执行,必须依存在进程中;


优缺点:线程和进程在使用上各有优缺点线程执行开销少,但不利于资源管理和保护 ,而进程则相反。同时进程可以 跨机器迁移