爱易网
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 浏览次数:21543 次
使用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开发环境
免责声明:
本文仅代表作者个人观点,与爱易网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
相关资料
更多>
怎么修改windows server 2003 的登录密码
封锁Windows 7休眠功能并删除hiberfil.sys,还给C盘空间
哪位高手能告诉小弟我这段代码是干什么的
哪位能提供《Windows安全性编程》书籍,该怎么处理
网络中突然多出一个IP,不知是如何产生的
让Windows7中“运作和资源管理器地址拦”不记录历史记录
,2003 server 文件服务器资源管理器报错
怎么映射内网VPN服务器到外网?
能否共享adobe pdf打印机解决方法
推荐阅读
更多>
有没有什么办法快捷切换ie8的安全级别呢?有的网页不让复制这时候要改成高级,但是复制完了又要改回来,所以想有没有什么快捷切换方法?解决方法
【请问】想删除指定文件夹中新建时间超过1小时的所有文件
注册表中的自动启动项解决思路
ie不能打开https网站页面解决方法
win32蠕虫病毒解决方法
如何关闭windows的tcp/ip协议栈
关于server2003,该如何解决
windows server2008 R2上可以装配windows media player么
怎么让Win+Z拥有Win+R的效果?实在不行,Z直接替换R也可以
在Windows8 Winrt中 高性能处置多个条件语句 用于实现自定义手势
,应该怎样设置才能让远程桌面连接虚拟机中的xp系统
关于冰刃解决思路
VS装到一半有异常
路由器+交换机的有关问题
装配office 2007出现 windows installer 服务不能更新一个或多个受保护的windows 文件
怎的删掉win7启动项
asp做的下传图片功能,服务器下内网可以下传,外网下传不了,请教是什么有关问题
服务器常常被提权创建新用户,有什么方法能禁止创建新用户吗
切换windows停共享用户
求救:电脑状态监视和保护软件的设计-毕业设计题目解决方法