.NET/C#⾯试题汇总系列:多线程

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.描述线程与进程的区别?

  1. 定义与区别‌:

    • 进程‌(Process)是系统进行资源分配和调度的一个独立单元,是操作系统结构的基础。它是应用程序的一次动态执行过程,是程序代码及其数据在运行时的一个实例。它拥有独立的内存空间,包含一组系统资源(如代码、数据和打开的文件等)。
    • 线程‌(Thread)是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的独立运行的单位。一个进程可以拥有多个线程,这些线程共享该进程的所有资源(如内存和打开的文件),但每个线程都拥有自己独立的执行栈和程序计数器。
  2. 资源与开销‌:

    • 进程拥有独立的内存空间和系统资源,因此进程间的通信相对复杂,开销也较大。
    • 线程共享进程的资源,因此线程间的通信相对简单,开销也较小。
  3. 独立性‌:

    • 进程拥有更高的独立性,一个进程的崩溃通常不会影响到其他进程。
    • 线程则不然,一个线程的崩溃可能会导致整个进程的崩溃(取决于线程的异常处理机制)。

3.Windows单个进程所能访问的最⼤内存量是多少?它与系统的最⼤虚拟内存⼀样吗?这对 于系统设计有什么影响?

这个需要针对硬件平台,公式为单个进程能访问的最⼤内存量=2的处理器位数次⽅/2,⽐如通常情况下, 32位处理器下,单个进程所能访问的最⼤内存量为:232 /2 = 2G 。

单个进程能访问的最⼤内存量是最⼤ 虚拟内存的1/2,因为要

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值