0

我对 pthread_mutex_t 有疑问。当我尝试创建静态字段 pthread_mutex_t,然后在静态函数中对其进行初始化并最终在某些类方法中使用它时,我遇到了许多错误,例如:

main.o: In function `LogWriter::initialize(pthread_mutex_t*)':
 main.cpp:(.text._ZN9LogWriter10initializeEP15pthread_mutex_t[LogWriter::initialize(pthread_mutex_t*)]+0x7): undefined reference to `LogWriter::mutex'

简化类代码:

class LogWriter{
    static pthread_mutex_t mutex;

    static void initialize(pthread_mutex_t *mut){
    LogWriter::mutex = PTHREAD_MUTEX_INITIALIZER;
    //if(pthread_mutex_init(&(LogWriter::mutex), NULL) != 0){
        //init failed
    //}
    }
    public:
    static LogWriter getInstance(string module_name){
    LogWriter  instance(module_name);
    return instance;
    }

    LogWriter& operator<<(string a);
};

我的问题是:为什么?我知道如果我将它定义为普通(非静态)字段,我不会有任何问题。也搜索了谷歌,但我找不到与此相关的任何材料。还创建指向静态 pthread_mutex 的指针并在主函数中初始化,就像这样结束。

4

1 回答 1

5

在代码中的某些源文件中,您需要添加:

static LogWriter::pthread_mutex_t mutex;

编译器不会将您的变量“放置”在任何特定的源文件中,您必须为它这样做。该class声明只是告诉编译器“我将在某个地方有一个静态变量” - 但是至少在理论上,变量排序和放置可以产生影响[例如,您可能有不同的目标文件产品“数据”进入不同的某些嵌入式系统中的内存部分],编译器将无法将它扔到它喜欢的任何地方——这可能是你不想要的地方。

于 2013-03-10T14:55:11.503 回答