1.根据线程安全的相关知识,分析以下代码,当调⽤test⽅法时i>10时是否会引起死锁?并简 要说明理由。
public void test(int i)
{
lock(this)
{
if (i>10)
{
i--;
test(i);
}
}
}
不会发⽣死锁,(但有⼀点int是按值传递的,所以每次改变的都只是⼀个副本,因此不会出现死锁。但如 果把int换做⼀个object,那么死锁会发⽣)
lock
关键字:用于确保当多个线程同时访问共享资源时,不会发生数据竞争(race condition)或数据不一致的问题。
lock
语句通过获取给定对象的互斥锁来同步代码块,以确保一次只有一个线程可以执行该代码块。
- 示例 : 线程安全的集合操作
public class ThreadSafeList<T> { private readonly List<T> _list = new List<T>(); private readonly object _lockObject = new object(); public void Add(T item) { lock (_lockObject) { _list.Add(item); } } public void Remove(T item) { lock (_lockObject) { _list.Remove(item); } } public List<T> GetAll() { lock (_lockObject) { return new List<T>(_list); } } }
在这个例子中,我们创建了一个线程安全的列表类
ThreadSafeList<T>
,其中Add
和Remove
方法使用lock
来确保对列表的修改是线程安全的。GetAll
方法也使用lock
来确保在返回列表的副本时,列表的状态是一致的。
2.描述线程与进程的区别?
定义与区别:
- 进程(Process)是系统进行资源分配和调度的一个独立单元,是操作系统结构的基础。它是应用程序的一次动态执行过程,是程序代码及其数据在运行时的一个实例。它拥有独立的内存空间,包含一组系统资源(如代码、数据和打开的文件等)。
- 线程(Thread)是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的独立运行的单位。一个进程可以拥有多个线程,这些线程共享该进程的所有资源(如内存和打开的文件),但每个线程都拥有自己独立的执行栈和程序计数器。
资源与开销:
- 进程拥有独立的内存空间和系统资源,因此进程间的通信相对复杂,开销也较大。
- 线程共享进程的资源,因此线程间的通信相对简单,开销也较小。
独立性:
- 进程拥有更高的独立性,一个进程的崩溃通常不会影响到其他进程。
- 线程则不然,一个线程的崩溃可能会导致整个进程的崩溃(取决于线程的异常处理机制)。
3.Windows单个进程所能访问的最⼤内存量是多少?它与系统的最⼤虚拟内存⼀样吗?这对 于系统设计有什么影响?
这个需要针对硬件平台,公式为单个进程能访问的最⼤内存量=2的处理器位数次⽅/2,⽐如通常情况下, 32位处理器下,单个进程所能访问的最⼤内存量为:232 /2 = 2G 。
单个进程能访问的最⼤内存量是最⼤ 虚拟内存的1/2,因为要