首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C++中创建竞赛条件

如何在C++中创建竞赛条件
EN

Stack Overflow用户
提问于 2018-09-26 20:57:30
回答 3查看 1.8K关注 0票数 1

我想在竞赛条件下测试一些对象的线程安全函数。为了测试这一点,我想同时从两个(或更多)不同的线程调用一个函数。我如何编写代码来保证函数调用同时发生,或者至少足够接近它才能达到预期的效果?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-26 21:27:53

你能做的最好的就是重击代码,检查所有你可能得到的问题的迹象。如果存在种族条件,您应该能够编写最终会触发它的代码。考虑:

代码语言:javascript
复制
#include <thread>
#include <assert.h>

int x = 0;

void foo()
{
    while (true)
    {
        x = x + 1;
        x = x - 1;
        assert(x == 0);
    }
}

int main()
{
    std::thread t(foo);
    std::thread t2(foo);

    t.join();
    t2.join();
}

无论我在哪里测试它,它都会很快地断言。然后,我可以添加关键部分,直到断言消失。

但事实上,这并不能保证它会坚持到底。但是我已经在大规模的生产代码中反复使用了这种技术。当然,您可能需要在很长一段时间内对代码进行敲击。

票数 2
EN

Stack Overflow用户

发布于 2018-09-26 21:37:12

有一个结构,其整数数组的字段为零,可能有300-500 kB长.然后,从两个线程中,复制另外两个结构(一个具有1s,另一个具有2s),就在某些原子内存发出屏障之前(当然,未定义的行为区域已经完成,检查原子变量的值)。

这应该有很大的可能性,不确定的行为,也许你可以看到混合的1s,2s (甚至0?)知道发生了什么。

但是,当您删除所有控件(如atomics )时,新形状也可能是另一种未定义的行为,并且行为不同。

票数 -1
EN

Stack Overflow用户

发布于 2018-09-27 00:12:35

要做到这一点,最好的方法是插入时间合适的sleep调用。例如,您可以使用它强制按要测试的顺序组合事件(Thread 1执行某些操作,然后Thread 2执行某些操作,然后Thread 1执行其他操作)。缺点是,您必须知道将sleep调用放在哪里。在做了一段时间之后,你应该开始感觉到它,但是一些好的直觉在开始的时候会有所帮助。

如果可以获得线程id的句柄,则可以有条件地调用sleep或从特定线程命中断点。

另外,我确信Visual和(我认为) GDB允许冻结一些线程和/或运行特定的线程。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52525944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档