刚学多线程,这是我在codeproject下的一个代码,我感觉作者写的这两个代码没有用,不知道是不是写错了,请指教//
//临界区变量声明,这个临界区只在下面两个函数中出现,
CCriticalSection m_critSection;
bool m_cancelBurn;//这是个刻录程序,Set函数来改变m_cancelBurn的值,Get函数通过获取m_cancelBurn的值来判断是否终止操作
//Set函数只在主线程出现,Get函数只在子线程出现,程序只有一个子线程
//我觉得两个函数都应该在初始化CSingleLock后Lock,才能达到同步的作用对吗void CBurnCDDlg::SetCancelBurning(bool bCancel)
{
CSingleLock singleLock(&m_critSection); m_cancelBurn = bCancel;
}bool CBurnCDDlg::GetCancelBurning()
{
CSingleLock singleLock(&m_critSection);
return m_cancelBurn;
}
//临界区变量声明,这个临界区只在下面两个函数中出现,
CCriticalSection m_critSection;
bool m_cancelBurn;//这是个刻录程序,Set函数来改变m_cancelBurn的值,Get函数通过获取m_cancelBurn的值来判断是否终止操作
//Set函数只在主线程出现,Get函数只在子线程出现,程序只有一个子线程
//我觉得两个函数都应该在初始化CSingleLock后Lock,才能达到同步的作用对吗void CBurnCDDlg::SetCancelBurning(bool bCancel)
{
CSingleLock singleLock(&m_critSection); m_cancelBurn = bCancel;
}bool CBurnCDDlg::GetCancelBurning()
{
CSingleLock singleLock(&m_critSection);
return m_cancelBurn;
}
解决方案 »
- 错误:“IsHighContastMode”: 不是“AFX_GLOBAL_DATA”的成员
- tcp/ip网络编程的问题。
- 标签打印系统怎么写?
- 疑惑:(请北京的朋友帮忙)德信无线委托联合创新招人,技术培训是否应该交一笔巨额培训费? 急!!在线等!
- opengl画nurbs曲线,只有控制点(Control point)曲线,没有穿越点(Point curve)曲线吗
- 想让线程休眠一段时间在执行应怎么做??
- 如何调用MSCOMM控件对串口进行操作
- 数学函数中有没有控制浮点数小数位数的函数?请给出函数原形。在线等
- 谁知道国外人气很旺的BBS社区? To ASM
- !!!!!!!!!!!!!为什么delete一个对象会导致stack overflow,而且没法跟踪?
- GetProcAddress得不到user32里的函数地址?
- Visual Studio 2005 代码优化
{
CSingleLock singleLock(&m_critSection);//这里需要调用Lock才能同步m_cancelBurn变量
singleLock.Lock();
m_cancelBurn = bCancel;
}bool CBurnCDDlg::GetCancelBurning()
{
CSingleLock singleLock(&m_critSection,TRUE); //这里不需要调用Lock就能同步m_cancelBurn变量
return m_cancelBurn;
}
//声明
CSingleLock(CSyncObject* pObject, BOOL bInitialLock = FALSE);
//定义
CSingleLock::CSingleLock(CSyncObject* pObject, BOOL bInitialLock)
{
ASSERT(pObject != NULL);
ASSERT(pObject->IsKindOf(RUNTIME_CLASS(CSyncObject))); m_pObject = pObject;
m_hObject = pObject->m_hObject;
m_bAcquired = FALSE;
//因为bInitialLock默认值为FALSE,以下不执行
if (bInitialLock)
Lock();
}
//以下是CCriticalSection类的实现
//在构造函数里只是InitializeCriticalSection并没有EnterCriticalSection
_AFXMT_INLINE CCriticalSection::CCriticalSection() : CSyncObject(NULL)
{ ::InitializeCriticalSection(&m_sect); }_AFXMT_INLINE CCriticalSection::~CCriticalSection()
{ ::DeleteCriticalSection(&m_sect); }_AFXMT_INLINE BOOL CCriticalSection::Lock()
{ ::EnterCriticalSection(&m_sect); return TRUE; }_AFXMT_INLINE BOOL CCriticalSection::Unlock()
{ ::LeaveCriticalSection(&m_sect); return TRUE; }这样就能给CCriticalSection变量加锁了吗???
singleLock.Lock();
会调用CCriticalSection::Lock()函数,所以可以给变量加锁了