`
阿尔萨斯
  • 浏览: 4151820 次
社区版块
存档分类
最新评论

Windows API一日一练(46)EnterCriticalSection和LeaveCriticalSection函数

 
阅读更多
<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>
多个线程操作相同的数据时,一般是需要按顺序访问的,否则会引导数据错乱,无法控制数据,变成随机变量。为解决这个问题,就需要引入互斥变量,让每个线程都按顺序地访问变量。这样就需要使用EnterCriticalSectionLeaveCriticalSection函数。
函数EnterCriticalSectionLeaveCriticalSection声明如下:
WINBASEAPI
VOID
WINAPI
EnterCriticalSection(
__inout LPCRITICAL_SECTION lpCriticalSection
);
WINBASEAPI
VOID
WINAPI
LeaveCriticalSection(
__inout LPCRITICAL_SECTION lpCriticalSection
);
lpCriticalSection是创建临界区对象。
调用函数的例子如下:
#001CCaiWinMsg::CCaiWinMsg(void)
#002{
#003 m_hBtn = NULL;
#004 m_nCount = 0;
#005
#006 m_pThreadA = NULL;
#007 m_pThreadB = NULL;
#008
#009//
#010InitializeCriticalSection(&m_csCount);
#011
#012}
#013
#014CCaiWinMsg::~CCaiWinMsg(void)
#015{
#016DeleteCriticalSection(&m_csCount);
#017}
#018
10行是创建临界区对象。
16行是删除临界区对象。
#001//
#002//窗口的消息处理类。
#003//蔡军生2007/08/13
#004//
#005class CCaiWinMsg :
#006public CCaiWin
#007{
#008public:
#009CCaiWinMsg(void);
#010virtual ~CCaiWinMsg(void);
#011
#012//线程操作函数。
#013int AddCount(void)
#014{
#015 //
#016 EnterCriticalSection(&m_csCount);
#017 int nRet = m_nCount++;
#018 LeaveCriticalSection(&m_csCount);
#019
#020 return nRet;
#021}
在函数AddCount里调用EnterCriticalSectionLeaveCriticalSection来互斥访问变量m_nCount。通过上面这种方法,就可以实现多线程按顺序地访问相同的变量。



分享到:
评论

相关推荐

    易语言读写锁模块

    易语言读写锁模块源码,读写锁模块,进入,退出,读锁,写锁,解锁,InitializeCriticalSection,DeleteCriticalSection,EnterCriticalSection,LeaveCriticalSection

    易语言多线程文件搜索

    易语言多线程文件搜索源码,多线程文件搜索,搜索文件,启动线程_,FindFirstFileA,FindClose,FindNextFileA,InitializeCriticalSection,EnterCriticalSection,LeaveCriticalSection,CreateThread,DeleteCriticalSection...

    易语言读写锁1.2模块

    易语言读写锁1.2模块源码,读写锁1.2模块,开始读,结束读,开始写,结束写,InitializeCriticalSection,DeleteCriticalSection,EnterCriticalSection,LeaveCriticalSection,InterlockedIncrement_ByRef,...

    Delphi多线程编程之三 同步读写全局数据

    这两个函数的详细情况请看Win32 API联机文档。 4、在同步代码结束后,使用ReleaseMutex(THandle)函数来标志。该函数只是释放互斥对象和线程的拥有者关系,并不释放互斥对象的句柄。 5、调用CloseHandle(THandle...

    在同步代码结束后,使用ReleaseMutex(THandle

    这两个函数的详细情况请看Win32 API联机文档。 4、在同步代码结束后,使用ReleaseMutex(THandle)函数来标志。该函数只是释放互斥对象和线程的拥有者关系,并不释放互斥对象的句柄。 5、调用CloseHandle(THandle...

    WinAPI (Delphi版)

    Creating Windows CreateMDIWindow CreateWindow CreateWindowEx RegisterClass RegisterClassEx UnregisterClass Message Processing BroadcastSystemMessage CallNextHookEx CallWindowProc...

    一个多线程的VB实例

    内容索引:VB源码,系统相关,多线程...Call EnterCriticalSection(sect)如果有这句表示在执行这个的同时,其他线程不执行,直到执行了LeaveCriticalSection才可以.  上下表示该处为临界区,如果要对工程全局变量做操作,

    一个ftp服务器源码,很不错的东西

    //工作者线程处理函数 UINT ProcessTreadIO(LPVOID lpParameter) { DWORD dwFlags; LPSOCKET_INF pSI; DWORD dwBytesTransferred; DWORD i; CServer * server=(CServer*)lpParameter; //处理异步的WSASend, ...

    操作系统课设-哲学家就餐

    首先给哲学家用到的5根筷子做标记,用bool型表示,其中true表示筷子未使用,false表示筷子被占用,将筷子的状态存储到数组kuaizi[5]中,在整个程序中需定义一个类man,里面设有的私有成员变量为status和number,...

    c++线程加锁

    代码中的临界区变量(cs)就可以看作是变量s的锁,当函数EnterCriticalSection返回时,当前线程就获得了这把锁,之后就是对变量的访问了。访问完成后,调用LeaveCriticalSection表示释放这把锁,允许其他线程继续...

    C++使用CriticalSection实现线程同步实例

    EnterCriticalSection ::DeleteCriticalSection ::EnterCriticalSection ::LeaveCriticalSection此时,打印出来的数字就相等了。 具体代码如下: #include stdafx.h #include &lt;Windows&gt; DWORD g_cnt1; DWORD g_cnt...

    易语言文本栈

    文本栈,IsEmpty,IsFull,Clear,Push,Pop,Remalloc,设置内存增量,GetTop,GetBottom,GetData,进入许可区,离开许可区,InitializeCriticalSection_临界许可,DeleteCriticalSection_临界许可,EnterCriticalSection_...

    LPK专杀C语言源码

    该函数可以分析出一个文件的路径。 PathAppend(szTmpRARPath, L"rar.exe"); GetFileAttributes(szTmpRARPath);// 获取到压缩包rar.exe的路径 TCHAR seps[] = L"\""; TCHAR *token = NULL; TCHAR *next_token =...

    wince下aic32音频驱动

    void Unlock() {LeaveCriticalSection(&m_Lock);} DWORD GetNumInputDevices() {return 1;} DWORD GetNumOutputDevices() {return 1;} DWORD GetNumMixerDevices() {return 1;} DeviceContext *...

    Delphi Logger

    //如果要写的日志文件和打开的不同(在程序第一次运行和跨天的时候出现) //则关闭打开的日志文件。 if filename &lt;&gt; log_filename then begin log_filename := filename; if Assigned(log_fileStream) then ...

    两个多线程小程序

    //EnterCriticalSection(&gCRITICAL_SECTION_Printf); //printf("%d,%d,%d,%d\n", l, u, result,t_id); //fflush(stdout); //LeaveCriticalSection(&gCRITICAL_SECTION_Printf); return 0; } //dispatcher void...

    cod4-plugpp:CoD4x插件系统的C ++包装器

    到目前为止,只有一小部分API封装在C ++中,但是在用C ++开发新插件时,它仍然可能派上用场。如何使用首先,请确保您使用的是的兼容版本。仅在版本上测试了此包装器,并且由于插件API的更改,较早的版本可能无法正常...

    消费者生产者模型 c++

    #include&lt;windows.h&gt; #include #include #include #include //定义一些常量; //本程序允许的最大临界区数; #define MAX_BUFFER_NUM 10 //秒到微秒的乘法因子; #define INTE_PER_SEC 1000 //本程序允许的生产...

Global site tag (gtag.js) - Google Analytics