b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

多线程死锁的例子 学习线程(1)

电脑杂谈  发布时间:2018-02-13 00:08:16  来源:网络整理

发生死锁的例子_多线程 死锁 cuda_多线程死锁的例子

先来介绍简单的线程使用:使用new方法来创建线程,至于撤销线程,我们不必去管(我也不知道怎么去管XD),因为CLR已经替我们去管理了。

先来看一个简单的使用线程的例子:

我们可以用过new的方式创建一个线程,然后使用Start()的方法来运行该线程,线程则会在其生命周期去执行Method1方法,执行方法肯定需要时间的,但是Method1的方法过于简单,我们使用Thread.Sleep的方法来进行停顿,这个方法可以暂时将当前的线程睡眠一段时间(毫秒为单位),因为主线程只是创建并运行t1子线程,运行任务的不是主线程,所以主线程可以继续往后执行程序。

我们还可以向线程执行的方法传入一个参数,例如线程2,在t2执行Start方法时,传入想要传入的参数,然后就可以在运行的时候使用了;不过参数是有限制的,在子线程的方法只能接受object的类型的参数,则在使用的时候需要显式转换类型,还有就是只能接受一个参数,多个参数也不会支持。

线程的new也支持Lambda表达式,若是执行方法比较简单,或者在某些场景下,我们可以将线程执行的代码使用Lambda内置到新建里面:

这里这样子写还有一个好处,就是这里可以直接使用主方法里面的变量,当然,这也会产生线程安全的问题。

一个进程中的多个线程都是可以访问其进程的其他资源,多线程若不加以控制也是并发执行的,若在多线程的执行方法中包含操作全局变量、者静态变量或是使用I/O设备的时候,很容易的就会产生线程安全的问题,从而导致不可预估的错误。这里就需要进行线程同步了,下面介绍一些线程同步的方式。

我们有时候开启了n各子线程来进行辅助计算,但是又想主线程等待所有子线程计算完毕在接着执行,或者线程之间的关系更复杂,其中涉及了线程的阻塞与激活,那么就可以使用Join()的方法来阻塞主线程,实现一种最简单的线程同步:

除了Join()来实现线程间的阻塞与激活,还有同步事件来进行处理;同步事件有两种:AutoResetEvent和 ManualResetEvent。它们之间唯一不同的地方就是在激活线程之后,状态是否自动由终止变为非终止。AutoResetEvent自动变为非终止,就是说一个AutoResetEvent只能激活一个线程。多线程死锁的例子而ManualResetEvent要等到它的Reset方法被调用,状态才变为非终止,在这之前,ManualResetEvent可以激活任意多个线程:先来看ManualResetEvent的使用:

上面例子我们将主线程、线程1、线程2阻塞,使用线程3在3秒钟之后激活全部线程,显示成功

若是使用AutoResetEvent则只能激活主线程

注:ManualResetEvent会给所有引用的线程都发送一个信号(多个线程可以共用一个ManualResetEvent,当ManualResetEvent调用Set()时,所有线程将被唤醒),而AutoResetEvent只会随机给其中一个发送信号(只能唤醒一个)。

多线程 死锁 cuda_发生死锁的例子_多线程死锁的例子

这里的线程同步还可以使用委托与事件(推荐使用事件)来实现线程间的简单通讯,比如在某一线程执行到某一结点后,通过事件向另一个或者多个线程发送更多的信息。

上述的例子是各个子线程之间没有使用公共资源(公共变量、I/O设备等),它们只存在执行顺序上的先后;我们来找一个使用公共变量的例子试一试:

这里新建100个子线程,然后使用一个静态公共变量List输出线程的Id,以上述方法运行时,有时会报出错误:索引超出范围。必须为非负值并小于集合大小!说明当前子线程输出Id时,该集合被Clear掉了,这就是一个很简单的线程安全问题,所以需要使用Monitor来进行锁住代码块,MSDN推荐定义一个私有的初始化不会再变的object变量作为一个排他锁,因为排他锁变了就没意义了,下面代码就可以变为:


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-74428-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 山口由里子
      山口由里子

      择机升级应该是选项了

    每日福利
    热点图片
    拼命载入中...