<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>
多个线程操作相同的数据时,一般是需要按顺序访问的,否则会引导数据错乱,无法控制数据,变成随机变量。为解决这个问题,就需要引入互斥变量,让每个线程都按顺序地访问变量。这样就需要使用EnterCriticalSection和LeaveCriticalSection函数。
函数EnterCriticalSection和LeaveCriticalSection声明如下:
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里调用EnterCriticalSection和LeaveCriticalSection来互斥访问变量m_nCount。通过上面这种方法,就可以实现多线程按顺序地访问相同的变量。
分享到:
相关推荐
易语言读写锁模块源码,读写锁模块,进入,退出,读锁,写锁,解锁,InitializeCriticalSection,DeleteCriticalSection,EnterCriticalSection,LeaveCriticalSection
易语言多线程文件搜索源码,多线程文件搜索,搜索文件,启动线程_,FindFirstFileA,FindClose,FindNextFileA,InitializeCriticalSection,EnterCriticalSection,LeaveCriticalSection,CreateThread,DeleteCriticalSection...
易语言读写锁1.2模块源码,读写锁1.2模块,开始读,结束读,开始写,结束写,InitializeCriticalSection,DeleteCriticalSection,EnterCriticalSection,LeaveCriticalSection,InterlockedIncrement_ByRef,...
这两个函数的详细情况请看Win32 API联机文档。 4、在同步代码结束后,使用ReleaseMutex(THandle)函数来标志。该函数只是释放互斥对象和线程的拥有者关系,并不释放互斥对象的句柄。 5、调用CloseHandle(THandle...
这两个函数的详细情况请看Win32 API联机文档。 4、在同步代码结束后,使用ReleaseMutex(THandle)函数来标志。该函数只是释放互斥对象和线程的拥有者关系,并不释放互斥对象的句柄。 5、调用CloseHandle(THandle...
Creating Windows CreateMDIWindow CreateWindow CreateWindowEx RegisterClass RegisterClassEx UnregisterClass Message Processing BroadcastSystemMessage CallNextHookEx CallWindowProc...
内容索引:VB源码,系统相关,多线程...Call EnterCriticalSection(sect)如果有这句表示在执行这个的同时,其他线程不执行,直到执行了LeaveCriticalSection才可以. 上下表示该处为临界区,如果要对工程全局变量做操作,
//工作者线程处理函数 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,...
代码中的临界区变量(cs)就可以看作是变量s的锁,当函数EnterCriticalSection返回时,当前线程就获得了这把锁,之后就是对变量的访问了。访问完成后,调用LeaveCriticalSection表示释放这把锁,允许其他线程继续...
EnterCriticalSection ::DeleteCriticalSection ::EnterCriticalSection ::LeaveCriticalSection此时,打印出来的数字就相等了。 具体代码如下: #include stdafx.h #include <Windows> DWORD g_cnt1; DWORD g_cnt...
文本栈,IsEmpty,IsFull,Clear,Push,Pop,Remalloc,设置内存增量,GetTop,GetBottom,GetData,进入许可区,离开许可区,InitializeCriticalSection_临界许可,DeleteCriticalSection_临界许可,EnterCriticalSection_...
该函数可以分析出一个文件的路径。 PathAppend(szTmpRARPath, L"rar.exe"); GetFileAttributes(szTmpRARPath);// 获取到压缩包rar.exe的路径 TCHAR seps[] = L"\""; TCHAR *token = NULL; TCHAR *next_token =...
void Unlock() {LeaveCriticalSection(&m_Lock);} DWORD GetNumInputDevices() {return 1;} DWORD GetNumOutputDevices() {return 1;} DWORD GetNumMixerDevices() {return 1;} DeviceContext *...
//如果要写的日志文件和打开的不同(在程序第一次运行和跨天的时候出现) //则关闭打开的日志文件。 if filename <> 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...
到目前为止,只有一小部分API封装在C ++中,但是在用C ++开发新插件时,它仍然可能派上用场。如何使用首先,请确保您使用的是的兼容版本。仅在版本上测试了此包装器,并且由于插件API的更改,较早的版本可能无法正常...
#include<windows.h> #include #include #include #include //定义一些常量; //本程序允许的最大临界区数; #define MAX_BUFFER_NUM 10 //秒到微秒的乘法因子; #define INTE_PER_SEC 1000 //本程序允许的生产...