OpenCSP开源程序解析之OPENCSP_Mutex.cpp

#include ".\opencsp_mutex.h"

unsigned long OPENCSP_UsrMutex::_ulLockCnt(0);
DWORD OPENCSP_UsrMutex::_dwProcessId(0);
OPENCSP_Mutex OPENCSP_UsrMutex::_dscs;

OPENCSP_Mutex::OPENCSP_Mutex()     //线程同步
:_sect()                  //构造函数后加冒号 ,使用初始化成员列表对对象进行初始化
{//初始化一个临界资源对象,来解决同步互斥问题。参数为临界资源对象指针
   ::InitializeCriticalSection(&_sect);
}

OPENCSP_Mutex::~OPENCSP_Mutex()
{
   ::DeleteCriticalSection(&_sect);
}

OPENCSP_Mutex::operator LPCRITICAL_SECTION()
{
   return (LPCRITICAL_SECTION)&_sect;
}

BOOL OPENCSP_Mutex::lock()
{
   ::EnterCriticalSection(&_sect);//进入临界区,让每个线程都按顺序地访问变量
   return TRUE;
}

BOOL OPENCSP_Mutex::unlock()
{
   ::LeaveCriticalSection(&_sect);//离开临界区
   return TRUE;
}

OPENCSP_MutexLockerWkr::OPENCSP_MutexLockerWkr()
{
   while (::InterlockedExchange(&g_lock, 1) != 0)  //能以原子操作的方式交换俩个参数
   {
      Sleep(0);
   }
}

OPENCSP_MutexLockerWkr::~OPENCSP_MutexLockerWkr()
{
   ::InterlockedExchange(&g_lock, 0);
}

OPENCSP_UsrMutex::OPENCSP_UsrMutex()
{
   if (_dwProcessId == 0)
   {
      _dwProcessId = ::GetCurrentProcessId();//获取当前进程一个唯一的标识符
   }

   _dscs.lock();

   for (;;)
   {
      {
         OPENCSP_MutexLockerWkr locker;
         if ((g_sharedProcessID == 0) ||
             (g_sharedProcessID == _dwProcessId))
         {
            g_sharedProcessID = _dwProcessId;
            break;
         }
      }
      Sleep(1);
   }

   ++_ulLockCnt;
}

OPENCSP_UsrMutex::~OPENCSP_UsrMutex()
{
   if (--_ulLockCnt == 0)
   {
      OPENCSP_MutexLockerWkr locker;
      g_sharedProcessID = 0;
   }

   _dscs.unlock();
}
时间: 2024-12-05 05:22:19

OpenCSP开源程序解析之OPENCSP_Mutex.cpp的相关文章

OpenCSP开源程序解析之OPENCSP_Main.cpp

#include "OPENCSP_define.h" #include "OPENCSP_Keyset.h" #include "OPENCSP_Provider.h" #include ".\opencsp_cardaccess.h" #pragma data_seg("_OPENCSP_SHARED") /* Two variables are used to OPENCSP_UserMutext *

OpenCSP开源程序解析之OPENCSP_Alg.cpp

#include ".\opencsp_alg.h" DWORD OPENCSP_Alg::_index = 0; BOOL OPENCSP_Alg::isAlgSupported(ALG_ID algId) //判断algId是否是支持的算法 { for (DWORD i = 0; i < M_OPENCSP_ALG_INFO_NUM; i++) //M_OPENCSP_ALG_INFO_NUM 支持的算法的个数 { if (s_algInfo[i].aiAlgid == al

OpenCSP开源程序解析之OPENCSP_AuthUI.cpp

#include ".\opencsp_authui.h" #include ".\resource.h" extern HINSTANCE g_hModule; // 当前实例 MY_DATA_BLOB OPENCSP_AuthUI::_authData; //MY_DATA_BLOB二进制容器 INT_PTR OPENCSP_AuthUI::showAuthUI() {//在32位操作系统,64位操作系统上,一个int是4或8个字节.用INT_PTR代替int可

OpenCSP开源程序解析之OPENCSP_Hash.cpp

#include ".\opencsp_hash.h" //HASH函数主要用于完整性校验和提高数字签名的有效 OPENCSP_M$CSP* OPENCSP_Hash::_csp; //hKey如果哈希算法是密钥哈希,如HMAC或MAC 算法,就用此密钥句柄传递密钥.对非密钥算法,此参数为NULL OPENCSP_Hash::OPENCSP_Hash(ALG_ID Algid, HCRYPTKEY hKey, DWORD dwFlags)//Algid哈希算法的标示符 :_algId(

OpenCSP开源程序解析之OPENCSP_M*CSP.cpp

#include ".\opencsp_m$csp.h" OPENCSP_M$CSP* OPENCSP_M$CSP::_instance; OPENCSP_M$CSP::OPENCSP_M$CSP(void) { BOOL fOK = FALSE; fOK = CryptAcquireContext(&_hProv, TEXT("Keyset in MSCSP used by OpenCSP"), MS_ENHANCED_PROV, PROV_RSA_FUL

MFC画图程序解析笔记一

这是 //if not define的简写,是宏定义的一种,它可以根据是否已经定义了一个变量来进行分支选择,一般用于调试等等.实际上确切的说这应该是预处理功能中三种(宏定义,文件包含和条件编译)中的一种----条件编译. 目录 1定义 2内容 3作用 4形式 1定义编辑 #define x ... #endif C语言在对程序进行编译时,会先根据预处理命令进行"预处理".C语言编译系统包括预处理,编译和链接等部分. #ifndef x //先测试x是否被宏定义过 #define x 程

Joomla软件功能介绍与开源程序大比拼Joomla,wordpress,Drupal哪个好?

Joomla 软件功能介绍:    Joomla!是一套在国外相当知名的内容管理系统 (Content Management System, CMS),它属于Portal(企业入口网站)类型,顾名思义,就是比较适合作为商业类型的网站程序.一般人对这类型的内容管理系统可能会有以下的别名来称呼: ■ 架站程序(或软件) ■ 快速架站程序(或软件) ■ 整站程序 Joomla!是使用PHP语言加上MySQL数据库所开发的软件系统,可以在Linux. Windows.MacOSX等各种不同的平台上执行.

利用开源程序(ImageMagick+tesseract-ocr)实现图像验证码识别

利用开源程序(ImageMagick+tesseract-ocr)实现图像验证码识别 分类: 开放项目2012-07-23 17:28 6712人阅读 评论(0) 收藏 举报 tiffimagecompression引擎pascalcharacter --------------------------------------------------低调的分割线--------------------------------------------------- Linux下有两个重要的编程准则

fastjson是阿里巴巴的开源JSON解析库

fastjson的API十分简洁. String text = JSON.toJSONString(obj); //序列化 VO vo = JSON.parseObject("{...}", VO.class); //反序列化 https://github.com/alibaba/fastjson/wiki/Quick-Start-CN fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串