小编kis*_*ljr的帖子

如何检查std :: thread是否仍在运行?

如何检查a std::thread是否仍在运行(以独立于平台的方式)?它缺乏一种timed_join()方法,joinable()并不适用于此.

我想std::lock_guard在线程中使用a锁定互斥锁并使用try_lock()互斥锁的方法来确定它是否仍然被锁定(线程正在运行),但对我来说似乎不必要的复杂.

你知道更优雅的方法吗?

更新:要明确:我想检查线程是否干净地退出.为此,"悬挂"线程被认为正在运行.

c++ multithreading c++11 stdthread

76
推荐指数
4
解决办法
8万
查看次数

将std :: exception_ptr转换为boost :: exception_ptr

我想使用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,那么这也是一种可接受的解决方案

c++ boost c++11

6
推荐指数
1
解决办法
1541
查看次数

逐个组装类型的编译时列表(C++)

我想在编译时通过逐个添加类型来组装一个列表(实际上是一组).像这样的东西:

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.

更新:我只想补充一点,我不知道在添加新元素时添加到列表中的最后一个元素,但我知道列表本身(例如列表的头部)

c++

4
推荐指数
1
解决办法
1007
查看次数

如何用 Kubernetes API 对象的默认值惯用地填充空字段?

我想比较两个 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)

go kubernetes client-go

3
推荐指数
1
解决办法
1591
查看次数

标签 统计

c++ ×3

c++11 ×2

boost ×1

client-go ×1

go ×1

kubernetes ×1

multithreading ×1

stdthread ×1