爱易网
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 浏览次数:21035 次
使用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; }
上一篇:hyper-v管理器中-虚拟机-连接不上,看不到画面
下一篇: WindowsXP圆满搭建POCO开发环境
免责声明:
本文仅代表作者个人观点,与爱易网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
相关资料
更多>
win7 任务栏色彩,激活的窗口和未激活的窗口太难区分了
win2008服务器 日志 安全 出现大量 审核失败 任务类别:登录 求高手赐教,该怎么解决
winxp系统下,再加一根内存条,系统启动不起来?该如何处理
寻求Trojan horse Downloader.Small.58.AW专杀解决办法
请问:windowsXP下运行exe文件时的异常
求浏览器信息获取相关有关问题【急】
[骗点,渣译]WindowsPhone跟PhoneGap #11
Windows Server 2008 R2 Enterprise内存降不上来,用着用着就要重启,什么原因呢
三层交换机的VLAN互访功能的意义大吗?解决方法
推荐阅读
更多>
局域网互访,IIS解决方案
宏基5750g重装系统出错
求读写硬盘MBR的一段代码,C或者delphi的都可以.解决思路
【升星散分4】是寂寞~是HAPPY~解决方法
Windows 命令行基础(下)
ftp登陆小弟我校网站服务器有关问题
很可耻的下来求驱动了
天天报告截获特洛伊木马懂得进解决思路
两条线路,2个路由实现同一网段,该如何处理
用户远程修改密码解决办法
怎么用dos批量修改文件名, 比如: api.txt-〉api1.txt, api1.txt-〉api2.txt, api2.txt-〉api3.txt, api3.txt-〉api4.txt?
求免费好用的资料加密和解密软件
百度画蛇添足,主界面上添加上多余的东西,很讨厌,弃用,该如何解决
windows oracle 连接出错 ORA-12560: TNS: 协议适配器异常
桌面右键菜单 项目的添加,多谢了
更新:来源于MIX11的Windows Azure新闻
在文件上点右键,对文件进行删除、复制操作的时候,速度很慢,请教大概可能是什么原因引起的
哪位高手知道自由天空E驱动的设置驱动解压秘密如何解决啊
怎么快速修改共享打印机的连接上限
请教FlashFXP连接被拒绝,是什么原因