c++ - 在设置容器的 find() 上崩溃

标签 c++ templates stl crash set

我有一个锁定集合操作的 SyncSet 模板类。当我进行压力测试时,我崩溃了。当我检查崩溃输出文件时,原因似乎与设置容器的查找功能有关。你可以在下面看到我的模板类,你可以在 pastebin 链接中找到相关的崩溃输出:http://pastebin.com/1JzAWxjf

是不是我的模板类有什么问题可能导致这样的崩溃?其次,操作系统是否有可能因为超出内存限制或类似原因而中止应用程序,那么有没有办法在操作系统(Windows 7 专业版)上检查消息?

欢迎并采纳所有建议和意见。

谢谢。

template <typename T>
class SyncSet
{
public:
    SyncSet() {
        InitializeCriticalSection(&m_lock);
    }

    ~SyncSet() {
        DeleteCriticalSection(&m_lock);
    }

    void Insert(T elem) {
        EnterCriticalSection(&m_lock);
        m_set.insert(elem);
        LeaveCriticalSection(&m_lock);
    }

    bool Has(T elem) {
        if (m_set.empty() || m_set.find(elem) == m_set.end())
            return false;

        return true;
    }

    bool Erase(T elem) {
        if (!Has(elem))
            return false;
        EnterCriticalSection(&m_lock);
        m_set.erase(elem);
        LeaveCriticalSection(&m_lock);
        return true;
    }

    size_t Size() {
        return m_set.size();
    }

    void Clear() {
        EnterCriticalSection(&m_lock);
        m_set.clear();
        LeaveCriticalSection(&m_lock);
    }

private:
    std::set<T> m_set;
    CRITICAL_SECTION m_lock;
};

最佳答案

您的代码不是线程安全的,因为尽管您保护了临界区内对集合的所有写入,但您没有保护 Has() 中的读取。

因此,例如,当另一个线程删除整个集合时,压力测试可以在 Has() 调用的中途进行。

请注意,critical_Section 是一个门,它仅在其他 EnterCriticalSection() 调用时被检查,并且 Has 中的查找不使用它,因此当另一个线程位于临界区内时,那里的代码不会停止。

关于c++ - 在设置容器的 find() 上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15536102/

相关文章:

C++ 模板,默认参数作为方法

Django 模板过滤器 : counting objects

c++ - 全局 bool 变量和模板

c++ - 映射/设置迭代器不是可取消引用的 C++ 映射

c++ - 为什么我们不能通过索引访问元组的元素?

c++ - 什么是域错误

c++ - 如何使用 http ://www. opengl-tutorial.org/正确学习 OpenGL?

java - 我怎样才能避免在 java 中做很多 if?

c++ 字符串到 boost::multiprecision::cpp_int

c++ - 阴影贴图透视别名