gpt4 book ai didi

c++ - 正确的 pthread_t 初始化和处理

转载 作者:IT王子 更新时间:2023-10-29 00:49:30 27 4
gpt4 key购买 nike

我知道 pthread_t 应该被视为一个不透明的值,但是我不知道在用作类成员时如何初始化它,以及如何检查它的有效性。

考虑这个代码示例:

class MyClass
{
public:
pthread_t thread;

MyClass()
: thread(0) // Wrong because pthread_t should be an opaque value,
// so how should I initialize it?
{}

~MyClass()
{
if( thread ) // Wrong, but how can I verify if it is valid?
pthread_join(thread, NULL);
}
};

我也明白,如果pthread_create()失败,可能是pthread_t的值不一致。所以我应该只依赖于 pthread_create() 的返回值。但这意味着我应该将此返回值与 pthread_t 一起保留并使用它来检查线程有效性?在这种情况下,我应该如何在类构造函数中初始化这个值?

class MyClass
{
public:
pthread_t thread;
int threadValid;

MyClass()
: thread(0), // Wrong because pthread_t should be an opaque value,
// so how should I initialize it?
, threadValid(1) // pthread_create return zero in case of success,
// so I can initialize this to any nonzero value?
{}

~MyClass()
{
if( threadValid == 0 ) // Nonzero means thread invalid.
// Is this the correct approach?
{
pthread_join(thread, NULL);
threadValid = 1;
}
}
};

我有 Windows API 背景,那里有一个线程有它的 HANDLE 值,可以安全地初始化为 NULL,并且可以根据 NULL 检查,如果 CreateThread() 失败,它只会始终返回 NULL。使用 pthreads 就没有办法保持这种简洁明了的方法吗?

最佳答案

pthread_t 是 C 类型,所以它必须有一个简单的默认构造函数;所以你可以对它进行值初始化:

    : thread(), // ...

您对 threadValid 的用法似乎有些困惑。最好将其设置为 bool,最初设置为 false,然后仅在 pthread_create 成功后将其设置为 true .

关于c++ - 正确的 pthread_t 初始化和处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30867779/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com