class A {
public:
A();
private:
pthread_mutex_t mu;
};
A::A()
{
mu = PTHREAD_MUTEX_INITIALIZER; //cannot compile
}
我不能在类成员函数中初始化pthread_mutex_t
吗?
答案 0 :(得分:10)
而不是:
A::A()
{
mu = PTHREAD_MUTEX_INITIALIZER; //cannot compile
}
试试这个:
A::A()
{
pthread_mutex_init( &(mu), NULL);
}
PTHREAD_MUTEX_INITIALIZER是一个宏,一个C struct初始化器,用于{0,0,0,0,0 {0}}之类的东西,只能在定义点使用。
答案 1 :(得分:7)
在这种情况下使用pthread_mutex_init
,因为常量用于编译时初始化。
答案 2 :(得分:2)
即使我们将其更改为在构造函数中使用初始化列表,它仍然会失败:
#include <pthread.h>
struct foo {
pthread_mutex_t test;
foo() : test(PTHREAD_MUTEX_INITIALIZER) {}
};
int main() {
foo f;
}
我们可以看到为什么失败,并且只能通过查看预处理器的输出来在几个上下文中进行初始化:
struct foo {
pthread_mutex_t test;
foo() : test({ { 0, 0, 0, 0, 0, { 0 } } }) {}
};
在C ++ 03中使用嵌套大括号进行初始化是不合法的,但更有趣的是C ++ 11使这种语法和用法完全合法。
在原始代码中,我们可以看到更多内容:
A::A()
{
const pthread_mutex_t test = PTHREAD_MUTEX_INITIALIZER; // initialization - fine
mu = test; // assignment - fine
mu = PTHREAD_MUTEX_INITIALIZER; // assignment - C++11 only
}
答案 3 :(得分:0)
我喜欢@askmish和@Diego的答案。我也喜欢@Flexo解释的内容。
但是,作为一种选择,如果您打算使用PTHREAD_MUTEX_INITIALIZER
宏进行初始化,则可以执行以下操作:在类定义static
内进行互斥体声明,如下所示:
class A {
public:
A();
private:
static pthread_mutex_t mu;
};
然后,您可以在任何成员函数之外的源文件中初始化此静态互斥体,如下所示:
class A {
public:
A();
private:
static pthread_mutex_t mu;
};
pthread_mutex_t A::mu = PTHREAD_MUTEX_INITIALIZER;
A::A()
{
}
您的选项:
pthread_mutex_init()
函数(如其他人所指出的那样)。