线程同步与线程池

2018-11-15  本文已影响0人  ottox

线程的优先级

五个优先级,由高到低分别是: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语句应注意的问题

多线程随机取款

//将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;
                }
            }
上一篇下一篇

猜你喜欢

热点阅读