Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的PTHREAD_MUTEX_初始值设定项+;成员函数无法编译?_C++_Pthreads - Fatal编程技术网

C++ C+中的PTHREAD_MUTEX_初始值设定项+;成员函数无法编译?

C++ C+中的PTHREAD_MUTEX_初始值设定项+;成员函数无法编译?,c++,pthreads,C++,Pthreads,我不能在类成员函数中初始化pthread\u mutex\t吗?在这种情况下使用,因为常量用于编译时初始化。而不是: class A { public: A(); private: pthread_mutex_t mu; }; A::A() { mu = PTHREAD_MUTEX_INITIALIZER; //cannot compile } 试试这个: A::A() { mu = PTHREAD_MUTEX_INITIAL

我不能在类成员函数中初始化
pthread\u mutex\t
吗?

在这种情况下使用,因为常量用于编译时初始化。

而不是:

class A {
    public:
        A();
    private:
        pthread_mutex_t mu;
};

A::A()
{
    mu = PTHREAD_MUTEX_INITIALIZER;  //cannot compile
}
试试这个:

A::A()
{
    mu = PTHREAD_MUTEX_INITIALIZER;  //cannot compile
}

PTHREAD_MUTEX_初始值设定项是一个宏,一个类似{0,0,0,0,0{0}的C结构初始值设定项,只能在定义点使用。

即使我们将其更改为在构造函数中使用初始值设定项列表,它仍然会失败:

A::A()
{
pthread_mutex_init( &(mu), NULL);
}
在C++03中使用嵌套大括号进行初始化是不合法的,但更有趣的是,C++11使这种语法和用法完全合法

在您的原始代码中,我们可以看到更多内容:

struct foo {
  pthread_mutex_t test;
  foo() : test({ { 0, 0, 0, 0, 0, { 0 } } }) {}
};

我喜欢阿斯克米什和迭戈的回答。我也喜欢@Flexo的解释

但作为一个选项,如果您打算使用
PTHREAD\u MUTEX\u初始值设定项
宏进行初始化,您可以做的是,在类定义
static
中声明互斥对象,如下所示:

A::A()
{
    const pthread_mutex_t test = PTHREAD_MUTEX_INITIALIZER; //  initialization - fine
    mu = test; // assignment - fine
    mu = PTHREAD_MUTEX_INITIALIZER;  // assignment - C++11 only
}
class A {
    public:
        A();
    private:
        static pthread_mutex_t mu;
};
然后,您可以在源文件中但在任何成员函数之外初始化此静态互斥体,如下所示:

A::A()
{
    const pthread_mutex_t test = PTHREAD_MUTEX_INITIALIZER; //  initialization - fine
    mu = test; // assignment - fine
    mu = PTHREAD_MUTEX_INITIALIZER;  // assignment - C++11 only
}
class A {
    public:
        A();
    private:
        static pthread_mutex_t mu;
};
您的选择:

  • 因此,要么保持宏,要么保持静态(如图所示)。或者
  • 您可以保持互斥体的声明不变(非静态),但在成员函数中使用
    pthread\u mutex\u init()
    函数(如其他人所示)

您显示的是赋值而不是初始化。那么我不能将
pthread\u mutex\t
数据成员放在初始化列表中,可以吗?对不起,我指的是编译时初始化,不是静态初始化。是的,您也不能将其(至少如果不是在C++11中)放入初始化列表中。原始代码也是合法的C++11,可能您的编译器中没有启用C++11支持。@Alcott标准只有3个主要版本-不要将特定供应商的编译器版本与标准版本混合使用。