如何检查a std::thread是否仍在运行(以独立于平台的方式)?它缺乏一种timed_join()方法,joinable()并不适用于此.
我想std::lock_guard在线程中使用a锁定互斥锁并使用try_lock()互斥锁的方法来确定它是否仍然被锁定(线程正在运行),但对我来说似乎不必要的复杂.
你知道更优雅的方法吗?
更新:要明确:我想检查线程是否干净地退出.为此,"悬挂"线程被认为正在运行.
我想使用boost::promise::set_exception()那个期待的boost::exception_ptr.问题是,boost:exception_ptr只有当我把所有的投掷包裹起来enable_current_exception并且我想避免这种情况时,似乎才能正常工作.(我不能够做到这一点的第三方库反正)我用std::exception_ptr/std::current_exception在我的代码,所以我正在寻找一种方式来传递std::exception_ptr,其中一个boost:exception_ptr预期.执行以下操作的东西,但编译:
boost::exception_ptr convert(std::exception_ptr ex) {
try {
std::rethrow_exception(ex);
}
catch(auto& ex) {
try {
throw boost::enable_current_exception(ex);
}
catch (...) {
return boost::current_exception();
}
}
}
Run Code Online (Sandbox Code Playgroud)
你知道怎么做吗?
语境:
我需要boost::future::then(),所以使用a std::promise很遗憾不是一种选择(至少在目前)
如果你知道一种boost::exception_ptr依赖gcc 4.8编译器支持的方法enable_current_exception,那么这也是一种可接受的解决方案
我想在编译时通过逐个添加类型来组装一个列表(实际上是一组).像这样的东西:
struct HeadOfList;
struct Item1;
[ addToList<Item1, HeadOfList> ]
struct Item2;
[ addToList<Item2, HeadOfList> ]
Run Code Online (Sandbox Code Playgroud)
我不在乎列表的存储方式.我想到这样的事情:
template<typename T> struct NextInList { typedef void type; };
template<> struct NextInList<HeadOfList> { typedef Item1 type; };
template<> struct NextInList<Item1> { typedef Item2 type; };
template<> struct NextInList<Item2> { typedef Item3 type; };
Run Code Online (Sandbox Code Playgroud)
但是a boost::mpl::list也一样好.类型的顺序也无关紧要,我只是希望能够遍历它们并向它们添加新元素.
我对此有一种不好的感觉,因为这样的构造意味着例如LastElementOf<MyList>::type将在源文件的不同点(在添加新元素之前和之后)编译成不同类型,并且这对我来说似乎是假的.然而,这正是我现在想要的.
你觉得有可能吗?允许使用C++ 11.
更新:我只想补充一点,我不知道在添加新元素时添加到列表中的最后一个元素,但我知道列表本身(例如列表的头部)
我想比较两个 Kubernetes API 对象(例如v1.PodSpecs):其中一个是手动创建的(预期状态),另一个是从 Kubernetes API/客户端接收的(实际状态)。问题在于,即使两个对象在语义上相等,手动创建的结构体的未指定字段的值为零,而另一个结构体具有默认值,因此两者不匹配。这意味着简单的reflect.DeepEqual()调用不足以进行比较。
例如在此之后:
expected := &v1.Container{
Name: "busybox",
Image: "busybox",
}
actual := getContainerSpecFromApi(...)
Run Code Online (Sandbox Code Playgroud)
expected.ImagePullPolicywill be "", while actual.ImagePullPolicywill be "IfNotPresent"(默认值),所以比较失败。
是否有一种惯用的方法可以将 Kubernetes API 结构中的零值替换为默认值?或者是一个构造函数,它使用某个地方可用的默认值来初始化结构?
编辑:目前我正在对每个 K8s API 对象类型使用手写相等测试,但这对我来说似乎无法维护。我正在寻找一个简单的(一组)函数,它“知道”所有内置 Kubernetes API 对象字段的默认值(可能在下面的某个地方k8s.io/api*?)。像这样的东西:
expected = api.ApplyContainerDefaults(expected)
if !reflect.DeepEqual(expected, actual) {
reconcile(expected, actual)
}
Run Code Online (Sandbox Code Playgroud)