我已经看到了堆栈的一些无锁实现...我的问题是关于可见性,而不是原子性.例如,无锁堆栈的元素(不是指针)必须至多为64位?我是这么认为的,因为你无法保证知名度.真实示例:可以安全地插入此结构并从无锁容器中删除
struct person
{
string name;
uint32_t age;
}
Run Code Online (Sandbox Code Playgroud)
编辑:有些人对这个问题感到困惑.为了解释一下:如果作家把人推到堆栈上,读者就会得到它,是否保证读者看到(记忆可见性)正确的人的内容.
有时我想做
bool success= true;
success &&= dosmthing1();
success &&= dosmthing2();
success &&= dosmthing3();
if (success)
Run Code Online (Sandbox Code Playgroud)
让我们忽略我可以使用异常...我的问题是它是否由C++标准保证,对我的用例来说&=就像不存在&&=一样?...
编辑:做smthing-s返回布尔
根据一个Channel 9 E2E视频(其中包含Herb Sutter),如果number atomic<int>
number++是原子的,则在c ++ 0x中.有人可以确认它是如何在最终的C++ 11标准中(让我们假装它已经完成:)).
如果我有范围(一对2迭代器)有一种方法为该使用范围写入"for each"循环,而不是原始数组或容器.
像这样的东西:
auto rng = std::equal_range(v.begin(),v.end(),1984);
for(const auto& elem: rng) {
// ...
}
Run Code Online (Sandbox Code Playgroud) 大多数C++编译器都支持SIMD(SSE/AVX)指令
_mm_cmpeq_epi32
Run Code Online (Sandbox Code Playgroud)
我的问题是这个函数没有标记为constexpr,虽然"语义上"没有理由不使用这个函数,constexpr因为它是一个纯函数.
有什么办法,我可以写我自己的版本(例如)_mm_cmpeq_epi32是constexpr?
显然我希望运行时的函数使用正确的asm,我知道我可以重新实现具有慢速函数的任何SIMD函数constexpr.
如果你想知道为什么我关心constexprSIMD功能.非constexprness具有传染性,这意味着我的任何使用SIMD功能的功能都不可能constexpr.
我对synchronized_value的状态有点困惑,一方面它是在CppCoreGuidelines中建议的,但另一方面它在C++20中不可用,甚至没有boost版本(有一个实验版本)。
注:我知道标准化需要时间,但这篇论文是 2014 年的。
我最担心的是标准化过程中是否发现了一些问题,因此不应使用synchronized_value,这违反了核心准则。
CP.50:定义 a
mutex及其保护的数据。synchronized_value<T>尽可能使用原因:对于读者来说,要保护数据以及如何保护数据应该是显而易见的。这减少了锁定错误互斥锁或未锁定互斥锁的可能性。
使用 a
synchronized_value<T>确保数据具有互斥体,并且当访问数据时正确的互斥体被锁定。请参阅 WG21 提案以添加synchronized_value到未来的 TS 或 C++ 标准修订版。
下面的代码编译所有3级主要的编译器没有任何问题(MSVC与接受的无效类似的代码中的错误,但这是无关的我的问题):
#include <iostream>
namespace Z{
struct Na{
struct Batman{
int x=47;
};
};
}
int main(){
using Na = Z::Na;
return Na::Na::Na::Na::Na::Na::Na::Batman{}.x;
}
Run Code Online (Sandbox Code Playgroud)
这背后是否有任何逻辑,或者它只是一个奇怪的边缘情况,在应用为“正常”用途制定的规则时最终是合法的?
如果我的困惑不清楚:我希望奇怪的行被解析为
std::std::std和被拒绝Na::Na)的引用,然后在::Na遇到以下情况时被拒绝我知道 iota 可能很复杂(例如无限),因此在一般情况下这不容易完成,但在某些情况下应该可以在 O(1) 中进行查找/包含操作。
例如
int main() {
auto vals = views::iota(10'000'000'000, 100'000'000'000);
return ranges::find(vals, 74'656'000'000) != vals.end();
}
Run Code Online (Sandbox Code Playgroud)
“无限”运行(进行线性搜索)
显然检查可以在 O(1) 内完成。
有没有办法用 C++ 来实现这种通用方式(即在其他视图上查找/包含需要线性时间,并且当它检测到 iota 时需要 O(1)),或者我需要手动检测传递给我的函数的视图是什么时候有限iota视图并进行>=front <=back检查?
我有VS 2012终极RC,最近我对Scala感兴趣,所以我想知道是否有一种方法(插件)在VS中进行简单的Scala编程?谷歌搜索显示了一些可能的承诺,但这些信息已超过一年.我知道Scala在JVM上运行,但我提到的信息提到了.Net版本.
我知道shared_ptr,在相同类型的构造函数中用作RVR参数后unique_ptr,weak_ptr保证是空的,但我不知道标准是否为std::我提到的其他类型指定了这个.
请注意,我知道移动后的元素保持有效但未指定的状态,我在这里感兴趣的是指定了哪些类型的状态.