爱易网
IT新闻
IT新闻
爱易资讯
网站搭建
云虚拟主机教程
云服务器教程
Apache教程
IIS教程
Nginx教程
网站策划
站长文章
推广教程
淘宝客教程
网页设计
HTML教程
XHTML教程
CSS教程
HTML5教程
CSS3教程
JavaSript基础
JQuery教程
Node.js教程
前端技术
Ajax教程
Js特效
Xml教程
平面设计
页面UI设计
photoshop教程
程序开发
AI人工智能
Asp教程
Php教程
Asp.Net教程
Net Core教程
C#教程
Java教程
Jsp教程
开发技术
微信小程序教程
Uniapp开发教程
微信公众号开发
Andriod教程
IOS教程
DOS教程
Python教程
Docker教程
Windows Container教程
数据库
MSSQL教程
MySQL教程
Redis教程
Access教程
Oracle教程
数据库教程
操作系统
Linux教程
Windows教程
MAC教程
Cisco教程
交换机教程
防火墙教程
搜索
爱易网页
Windows教程
使用event与无锁算法实现windows平台上的critical section
使用event与无锁算法实现windows平台上的critical section
日期:2014-05-17 浏览次数:21325 次
使用event与无锁算法实现windows平台下的critical section
//#include "own_cs.h" #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <assert.h> #include <malloc.h> #include <stdlib.h> #include <stdio.h> struct own_critical_section { long own_lock_count; // count of locked thread, -1 means unlock , other means lock. HANDLE own_event; // auto-reset DWORD own_owning_thread_id; // owner thread of lock long own_recursion_count; // count of recursion }; void InitialOwnCriticalSection( own_critical_section** own_cs) { *own_cs = (own_critical_section*)malloc( sizeof( own_critical_section ) ); (*own_cs)->own_lock_count = -1; (*own_cs)->own_event = CreateEventW( NULL, FALSE, FALSE, NULL ); (*own_cs)->own_owning_thread_id = 0; (*own_cs)->own_recursion_count = 0; } void DeleteOwnCriticalSection( own_critical_section* own_cs ) { assert( own_cs != NULL ); CloseHandle( own_cs->own_event ); free( own_cs ); } void EnterOwnCriticalSection( own_critical_section* own_cs ) { assert( own_cs->own_lock_count>=-1L ); for ( int spin_count = 0; spin_count < 500; ++ spin_count ) {//spinlock if ( -1L == InterlockedCompareExchange( &own_cs->own_lock_count, -1L, -1L ) ) break; Sleep(0); } DWORD current_thread_id = ::GetCurrentThreadId(); if( 0 < InterlockedIncrement( &own_cs->own_lock_count ) && ( own_cs->own_owning_thread_id != current_thread_id ) ) { //locked WaitForSingleObject( own_cs->own_event, INFINITE ); } own_cs->own_owning_thread_id = current_thread_id; ++own_cs->own_recursion_count; } void LeaveOwnCriticalSection( own_critical_section* own_cs ) { assert( own_cs->own_lock_count>=-1L ); if ( --own_cs->own_recursion_count == 0 ) own_cs->own_owning_thread_id = 0; if( -1L != InterlockedDecrement( &own_cs->own_lock_count ) && (::GetCurrentThreadId() == own_cs->own_owning_thread_id ) ) { SetEvent( own_cs->own_event ); } } bool TryEnterOwnCriticalSection( own_critical_section* own_cs ) { assert( own_cs->own_lock_count>=-1L ); DWORD current_thread_id = GetCurrentThreadId(); if ( current_thread_id == own_cs->own_owning_thread_id ) { // inside the lock InterlockedIncrement( &own_cs->own_lock_count ); return true; } else{ if ( -1L == InterlockedCompareExchange( &own_cs->own_lock_count, 0, -1L ) ) return false; own_cs->own_owning_thread_id = current_thread_id; } ++own_cs->own_recursion_count; return true; }
上一篇:安装更新时出现一些问题,但我们稍后会重试。 错误代码:0x8e5e0408
下一篇: WindowsXP圆满搭建POCO开发环境
免责声明:
本文仅代表作者个人观点,与爱易网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
相关资料
更多>
一个很难的NAT有关问题
频繁掉线,路由器日志内详,求分析,该如何处理
每次启动"windows install"服务后,又被自动停止了,什么原因?解决方案
此有关问题能用批处理实现吗
win11右键是更多选项怎么还原成之前的win10
如何做能把中文XP变为英文版的XP
Windows 2000 Server经常自动重启,这是为什么?解决方案
制造windows7那样的透明窗体2
一mp3文件,原来好的,现在发现前几秒有声,接着就没声音了,放其他mp3也是好的,没查出病毒,是什么道理?解决方法
推荐阅读
更多>
[转]windows上配置Memcached心得
安装VS2012究竟需要哪个版本的framework?该怎么处理
重装windows后ubuntu grub 指引启动的恢复
怎么使Windows Phone震动并播放声音
2000系统电脑老是重启,该如何解决
今天小弟我有账号啦
windows读写硬盘全部是通过int13吗?该如何处理
求解解决方法
见见支付宝就购买 Windows RT 版 Surface 32GB ¥3688.00
IE奇慢,但资源占用率却很低,不知是何原因解决思路
windows phone:数据绑定(2)
dos for 语句嵌套出错.解决方案
win2003的smtp如何配置啊邮件都堆在\mailroot\Queue中了
数字签名中的signerInfo中的encryptedDigest是如何计算出来的
备份不知如何搞的把资料经给不知备哪去了
IIS的windows身份认证可否封IP
紧急求救scrrun.dll无法注册解决方法
哪位高手帮小弟我分析一上wsus的日志啊多谢
跪求用html workshop制作帮助文件的教程!解决办法
Explorer到底是什么东西?—— 没那么简单,恳求解惑!该如何处理