线程同步与线程池
线程的优先级
五个优先级,由高到低分别是:Highest、AboveNormal、�Normal(默认)、BelowNormal和Lowest
可以使用下面的方法为其赋予较高的优先级:
Thread t = new Thread(MethodName);
t.priority = ThreadPriority.AboveNormal;
通过设置线程的优先级可以改变线程的执行顺序,所设置的优先级仅仅适用于这些线程所属的进程。
注意:
当把某线程的优先级设置为Highest时,系统正在运行的其他线程都会终止,所以使用这个优先级别时要特别小心。
线程同步
指多个线程之间存在先后执行顺序的关联关系。
哪些资源需要同步
- 系统资源(如通信端口)
- 多个进程所共享的资源(如文件句柄)
- 由多个线程访问的单个应用程序域的资源(如全局、静态和实例字段)
为什么要同步
当两个线程t1和t2有相同的优先级,并且同时在系统上运行时,如果先把时间片分给t1使用,它在结构s1中(该结构中有多个变量)写入某些值,但如果在时间片用完时它仍没有完成写入,这时由于时间片已经分给t2使用,而t2又恰好要尝试读取该结构的值,此时读出的就不是正确的值。这种情况下,如果使用同步仅允许一个线程使用s1,在该线程完成对s1的写入工作后再让t2读取这个结构值,就可以避免出现此类错误。
解决方法:
System.Threading命名空间提供了多个用于同步线程的类这些类包括Mutex、Monitor、Interlocked和AutoResetEvent。
在实际应用中经常使用lock语句完成线程同步。
该语句简化了编程的复杂性,使程序看起来既清晰又简洁
lock语句
lock语句的功能
lock语句可以有效地实现同步,即将代码段(语句块)标记为临界区。它能确保当一个线程位于代码的临界区(可以理解为一段代码)时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码段,则它将一直等待(即被阻塞),直到锁定的对象被释放以后才能进入临界区。
lock语句的用法
首先利用lock语句锁定某一个对象,然后执行代码段中的语句,等代码段中的语句执行完毕后,再释放该对象。
private Object obj = new Object();
……
lock(obj)
{
//临界区中的代码
}
使用lock语句应注意的问题
- 锁定的对象名(上面代码中的obj)一般声明为Object类型,不要将其声明为值类型。
- 锁定的对象名不能将其声明为public,只能为private
- 临界区中的代码一般不宜太多。
多线程随机取款
//将lock (lockedObj)这句注释掉,看看会发生什么情况
lock (lockedObj)
{
if (balance >= amount)
{
string str = Thread.CurrentThread.Name + "取款---";
str+= string.Format("取款前余额:{0,-6}取款:{1,-6}", balance, amount);
balance = balance - amount;
str += "取款后余额:" + balance;
form1.AddListBoxItem(str);
return amount;
}
else
{
return 0;
}
}