当前位置:  开发笔记 > 编程语言 > 正文

什么问题可以在互斥范围外调用std :: list/vector/map/deque :: empty()?

如何解决《什么问题可以在互斥范围外调用std::list/vector/map/deque::empty()?》经验,为你挑选了1个好方法。

请考虑以下代码段:

线程1:

while (true) {
    task = fetch_task();
    {
        lock_guard lock(my_mutex);

        // modify content of my_list
        my_list.push_back(task);
    }
}

线程2:

while (true) {
    if (!my_list.empty()) {
        {
            lock_guard lock(my_mutex);

            // modify content of my_list
            if (!my_list.empty()) {
                task = my_list.pop_front();
            }
        }
        if (taks) {
            handle_taks(task);
        }
    }
    do_some_other_stuff();
}

我知道这个代码在很多层面很差(比如异常处理),而且在任务处理方面还有更好的方法 - 我只对一个方面感兴趣:

my_list.empty()在互斥范围之外调用(可能是为了避免锁定my_mutex性能危急情况).

闻起来很糟糕,我不打算这样做 - 但我想知道真正发生了什么.empty()返回bool- 我可以假设至少这个电话是安全的吗?

当然,在我打电话后内容可能已经改变,empty()所以我必须通过再次检查empty()互斥范围内来避免竞争条件.

所以我的问题是 - 这种代码在假设中可以假设有关于误报,漏报甚至崩溃的影响吗?



1> Dietmar Kühl..:

对来自至少一个线程正在写入的不同线程的标准库类成员的非同步访问导致数据争用(除非明确定义,否则通常不是这种情况).数据竞争是未定义的行为.未定义的行为可能导致任意结果.

换句话说:列表中的所有内容都可能发生.许多其他事情也可能发生.

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有