概念
多个线程同时使用共享对象会造成很多问题,同步这些线程使得对共享对象的操作能够以正确的顺序执行非常重要,导致竞争条件的问题的原因就是线程没有正确的同步。当一个线程在使用共享资源的时候,其他线程应该依次等待,这种常见问题通常被称为线程同步。
更多内容
首先应尽量避免在多个线程间使用单一对象,从而去掉复杂的同步构造。如果实在无法避免,则只能使用原子操作。这个操作一旦开始,就一直运行到结束,不会被线程调度机制打断。这就避免了使用锁,也避免了死锁。
如果原子操作不可行,且程序逻辑很复杂,我们只能使用不同的方式来协调线程。我们可以将等待的线程置于阻塞状态,阻塞状态会尽量少地占用CPU资源,然而这以为着至少出现一次上下文切换(context switch)。上下文切换是指,操作系统的线程调度器会保存等待线程的状态,并切换到另一个线程,最后依次恢复等待的线程的状态,这相当消耗资源。如果线程被挂起很久,这是值得的,这被称为内核模式(kernel-mode),因为只有系统的内核才能阻止线程使用CPU时间。
但如果线程只是需要等待很少的一段时间,最好只是简单的等待而不是置于阻塞状态。虽然线程等待浪费CPU时间,但避免了上下文切换耗费的CPU时间,该方式成为用户模式(user-mode)。
注:本文是在阅读《C#多线程编程实战》后所写,部分内容引用该书内容,这是一本不错的书,感谢!