C++ 带有临界_部分的模板类已编译,但在使用时出错
我的库中有这些类C++ 带有临界_部分的模板类已编译,但在使用时出错,c++,multithreading,templates,critical-section,C++,Multithreading,Templates,Critical Section,我的库中有这些类 class SingleLock { public: SingleLock(CRITICAL_SECTION *pCS); ~SingleLock(); private: LPCRITICAL_SECTION m_cs; }; SingleLock::SingleLock(CRITICAL_SECTION *pCS) { m_cs = pCS; EnterCriticalSection(m_cs); } SingleLock::~Si
class SingleLock
{
public:
SingleLock(CRITICAL_SECTION *pCS);
~SingleLock();
private:
LPCRITICAL_SECTION m_cs;
};
SingleLock::SingleLock(CRITICAL_SECTION *pCS)
{
m_cs = pCS;
EnterCriticalSection(m_cs);
}
SingleLock::~SingleLock()
{
LeaveCriticalSection(m_cs);
}
template <typename T>
class Callback
{
public:
Callback() : m_current(), m_total(), m_cs()
{
InitializeCriticalSection(&m_cs);
}
~Callback()
{
DeleteCriticalSection(&m_cs);
}
void SetCurrent(T current)
{
SingleLock(&m_cs);
m_current = current;
}
void SetTotal(T total)
{
SingleLock(&m_cs);
m_total = total;
}
T GetCurrent()
{
SingleLock(&m_cs);
return m_current;
}
T GetTotal()
{
SingleLock(&m_cs);
return m_total;
}
private:
T m_total;
T m_current;
CRITICAL_SECTION m_cs;
};
现在一切都正常了,有人能解释为什么会发生这种情况吗?对此不满意,但在发布问题后立即发现错误,我需要
SingleLock sl(&m\cs)代码>而不是SingleLock(&m_-cs)
对此不满意,但在发布问题后立即发现错误,我需要单锁sl(&m\cs)代码>而不是SingleLock(&m_-cs)代码>原因是SingleLock(&m_-cs)代码>创建一个临时实例,该实例将立即销毁。声明变量就是将该变量保留在作用域中,直到函数销毁后返回代码>创建一个临时实例,该实例将立即销毁。声明变量就是将该变量保留在作用域中,直到函数销毁后返回。
template <typename T>
class Callback
{
public:
Callback() : m_current(0), m_total(0), m_cs()
{
InitializeCriticalSection(&m_cs);
}
~Callback()
{
DeleteCriticalSection(&m_cs);
}
void SetCurrent(T current)
{
EnterCriticalSection(&m_cs);
m_current = current;
LeaveCriticalSection(&m_cs);
}
void SetTotal(T total)
{
EnterCriticalSection(&m_cs);
m_total = total;
LeaveCriticalSection(&m_cs);
}
T GetCurrent()
{
EnterCriticalSection(&m_cs);
T result = m_current;
LeaveCriticalSection(&m_cs);
return result;
}
T GetTotal()
{
EnterCriticalSection(&m_cs);
T result = m_total;
LeaveCriticalSection(&m_cs);
return result;
}
private:
T m_total;
T m_current;
CRITICAL_SECTION m_cs;
};