我一直在阅读有关新的 C++11 内存模型的信息,并且遇到了该std::kill_dependency
功能(第 29.3/14-15 节)。我很难理解为什么我会想要使用它。
我在N2664 提案中找到了一个示例,但没有多大帮助。
它首先显示没有std::kill_dependency
. 在这里,第一行将依赖项携带到第二行中,第二行将依赖项携带到索引操作中,然后将依赖项携带到do_something_with
函数中。
r1 = x.load(memory_order_consume);
r2 = r1->index;
do_something_with(a[r2]);
还有一个例子std::kill_dependency
用来打破第二行和索引之间的依赖关系。
r1 = x.load(memory_order_consume);
r2 = r1->index;
do_something_with(a[std::kill_dependency(r2)]);
据我所知,这意味着索引和调用do_something_with
不是在第二行之前排序的依赖项。根据 N2664:
这允许编译器重新排序对 的调用
do_something_with
,例如,通过执行预测 的值的推测优化a[r2]
。
为了调用do_something_with
该值a[r2]
是必需的。如果,假设,编译器“知道”数组被零填充,它可以优化该调用do_something_with(0);
并根据其他两条指令重新排序该调用。它可以产生以下任何一种:
// 1
r1 = x.load(memory_order_consume);
r2 = r1->index;
do_something_with(0);
// 2
r1 = x.load(memory_order_consume);
do_something_with(0);
r2 = r1->index;
// 3
do_something_with(0);
r1 = x.load(memory_order_consume);
r2 = r1->index;
我的理解正确吗?
如果do_something_with
通过其他方式与另一个线程同步,那么这对于x.load
调用和另一个线程的顺序意味着什么?
假设我的理解是正确的,还有一件事困扰着我:当我编写代码时,什么原因会导致我选择杀死依赖项?