用户模式下线程同步

原子访问:指的是一个线程在访问某个资源的同时能够保证没有其他线程会在同一个时刻访问同一资源。

函数一:InterlockedExchangeAdd

原型 LONG InterlockedExchangeAdd(PLONG volatile plAddend, LONG lIncrement);

调用这个函数,传一个长整形变量的地址和另一个增量值,函数就会保证递增操作是以原子方式进行的。

高速缓存行:当CPU从内存中读取一个字节的时候,它并不只是从内存中取回一个字节,而是取回一个高速缓冲行。高速缓冲行可能包含32字节,64字节,甚至128字节。

高速缓冲行存在的目的是为了提升性能,一般来说,应用程序会对一组相邻的字节进行操作,如果所有字节都在高速缓存中,那么CPU就不必访问内存总线,后者耗费的时间比前者耗费的时间要多得多。

高速缓冲行在多处理器中的问题:

(1)CPU1读取一个字节,这使得该字节以及与它相邻的字节被读到CPU1的高速缓冲行中。

(2)CPU2读取同一个字节,这使得该字节被读到CPU2的高速缓冲行中。

(3)CPU1对内存中的这个字节进行修改,这使得该字节被写入到CPU1的高速缓冲行中,但这一信息还没有写回到内存。

(4)CPU2再次读取同一个字节。由于该字节已经在CPU2的高速缓冲行中,因此CPU2不需要再访问内存。但CPU2将无法看到该字节在内存中新的值。

对于以上问题,解决方法是:当一个CPU修改了高速缓冲行中的一个字节时,机器中的其他CPU会收到通知,并使自己的高速缓冲行作废。因此,CPU1修改该字节的值时,CPU2的高速缓存就作废了。第(4)步中,CPU1必须将它的高速缓存写回到内训中,CPU2必须重新范根内存来填满它的高速缓存行。

高级线程同步:

需要一种机制:既能让线程等待共享资源的访问权,又不会浪费CPU时间。


当线程想要访问一个共享资源或者想要得到一些特殊事件的通知时,线程必须调用操作系统的一个函数,并将线程正在等待的东西作为参数传入。如果操作系统检测到资源一斤可供使用了,或者特殊事件发生了,那么这个函数会立即返回,这样线程将仍然保持可调度状态。

如果无法取得对资源的访问权,或者特殊事件尚未发生,那么系统会将线程切换到等待状态,使线程变得不可调度,从而避免了让线程浪费CPU时间。当线程在等待的时候,系统会充当它的代理。系统会记得线程想要访问什么资源,当资源可供使用的时候,它会自动将线程唤醒—线程的执行与特殊事件是同步的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值