C#高级 05线程状态

2023-12-28 12:26:47

(1)进程和线程之间的关系

进程可以理解为一个应用,那么线程则可以看为一个进程中的多个执行单元(一个进程可以启动多个线程);

(2)进程之间如何通信

1.管道
2.消息队列
3.信号量
信号量不同于一般的ipc,它是一个·计数器。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通行数据。
信号量用于进程间同步,若要在进程传递数据需要结合·共享内存
信号量基于操作系统操作系统的pv操作,程序对信号量的操作都是原子操作
每一次信号量的pv操作不仅仅限于对信号量值的+1或-1,而且可以加减任意正整数
支持信号量组
4.共享内存
共享内存是最快的一种进程间通信 IPC(Inter-Process Communication),因为进程直接对内存进行读取。
因为多个进程可以同时操作,所以需要进行同步。
信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问。

(3)线程之间的通信

两个进程间的线程同学,相对于进程通信。
一个进程中的两个线程通信:

1.互斥锁
	mutex;
	lock_guard(在构造函数中加锁,在析构函数中解锁)
	unique_lock 自动加锁,解锁
2.读写锁
	shared_lock
3.信号量

(4)mian方法结束,程序是不是也结束了?

mian函数结束只是主线程结束了,主栈空了,其他栈(线程)可能还在压栈弹栈。

(5)单核cpu可以做到真正的多线程吗?

单核cpu在一个时间点只能处理一个事情,但是由于cpu运行速度极快,可以在多个线程之间频繁执行切换操作,从而给人的感觉是:多件事情同时在做!!

(6)什么是多线程并发?

t1 线程执行t1的,t2线程执行t2的,两者互不干扰,这叫做多线程并发

(7)线程的生命状态

在这里插入图片描述
新建状态(刚new出来线程对象)—(start())—>就绪状态;
就绪状态—(jvm调度)—>运行状态—(调用run运行结束后)—>死亡状态;
运行状态—(遇到阻塞事件,调用sleep,join方法)—>阻xianh塞状态;

join方法介绍:A线程调用了b线程的join()后,会等待b线程执行完毕,
在b线程没有执行完毕前,a线程会一直处于阻塞状态。举了个例子如下所示:
在这里插入图片描述

  • 线程安全:多个线程去访问同一个对象是,如果不考虑对应环境下的调度和交替执行,也不需
    要额外的同步,或者在调用方法进行任何其他操作,调用这个对象的任何行为都可以获得正确
    结果,那么这个对象就是线程安全的
  • 线程不安全:不提供数据访问保护,有可能出现多个线程先后更改数据造成多的数据时脏数据
  • 简单来说就是:当一个对象存在多个线程同时运行时,每个线程单次运行结果是一致的,但是当
    多个线程同时运行时就会出现结果不一致的现象。

(7)线程和对象的关系

  • 对象和线程没有直接关系,对象是类的实例,线程是多任务操作系统调度的产物,当线程具有时
    间片过后操作系统赋予它运行的活力;
  • 对象是通过线程的执行来改变其数据的,对象必定属于某个线程或者进程,如果对象不在线程中,
    那么它还没有成为对象,只能是类。

文章来源:https://blog.csdn.net/younger_to_older/article/details/135260924
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。