Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带有临界_部分的模板类已编译,但在使用时出错_C++_Multithreading_Templates_Critical Section - Fatal编程技术网

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;
};