posts - 34,comments - 2,trackbacks - 0
线程需要在下面两种情况下互相进行通信:
• 当有多个线程访问共享资源而不使资源被破坏时。
• 当一个线程需要将某个任务已经完成的情况通知另外一个或多个线程时。
解决办法:
1、原子访问。
原子访问,是指线程在访问资源时能够确保所有其他线程都不在同一时间内访问相同的资源。
使用的是互锁函数::互锁函数族:Interlocked*函数群(*表示省略后面的字符,即以Interlocked开头)。
互锁函数能够执行下列操作:
1) 打开C P U中的一个特殊的位标志,并注明被访问的内存地址。
2) 将内存的值读入一个寄存器。
3) 修改该寄存器。
4) 如果C P U中的特殊位标志是关闭的,则转入第二步。否则,特殊位标志仍然是打开的,寄存器的值重新存入内存。
2、关键代码段
关键代码段是指一个小代码段,在代码能够执行前,它必须独占对某些共享资源的访问权。在线程退出关键代码段之前,系统将不给想要访问相同资源的其他任何线程进行调度。
指定了一个C R I T I C A L S E C T I O N数据结构g c s,然后在对E n t e r C r i t i c a l S e c t i o n和L e a v e C r i t i c a lS e c t i o n函数调用中封装了要接触共享资源。




注意:如果有多个不是一道使用的资源,比如线程1和线程2访问一个资源,而线程1和线程3访问另一个资源,那么应该为每个资源创建一个独立的C R I T I C A L S E C T I O N结构。

3、循环锁
指在线程1中如果要对变量进行操作,要先查看这个变量(或资源)有没有被其它线程用到,如果是,则一直循环(循环次数自定),直到其它线程放弃对该变量(或资源)的控制,如果否,直接可以对该变量(或资源)进行操作。
posted on 2011-10-07 23:58 Yu_ 阅读(407) 评论(0)  编辑 收藏 引用 所属分类: Windows程序设计

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理