微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

错误:pthread rw_lock

如何解决错误:pthread rw_lock

所以我在某种数据结构中具有节点的此代码,并且该节点具有读写锁定 初始化我在使用pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER之前使用pthread_rwlock_init的锁;

由于某种原因,它给出了一个错误,说它应该在PTHREAD_RWLOCK_INITIALIZER之前出现一个表达式,但我不明白它是什么,因为我知道自己没有丢失任何东西;

代码

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "state.h"
#include <pthread.h>

typedef struct inode_t {    
    type nodeType;
    union Data data;
    // ******************NEW ATTRIBUTE THAT INLCUDES THE LOCK *******************************
    pthread_rwlock_t lock;
} inode_t;

void inode_table_init() {
    for (int i = 0; i < INODE_TABLE_SIZE; i++) {
        inode_table[i].nodeType = T_NONE;
        inode_table[i].data.dirEntries = NULL;
        inode_table[i].data.fileContents = NULL;
        // ****************** NEW *******************************
        // Initializes the lock
        pthread_rwlock_init(&inode_table[i].lock,NULL);
        inode_table[i].lock = PTHREAD_RWLOCK_INITIALIZER;
    }
}

int inode_create(type nType) {
    /* Used for testing synchronization speedup */
    insert_delay(DELAY);

    for (int inumber = 0; inumber < INODE_TABLE_SIZE; inumber++) {
        if (inode_table[inumber].nodeType == T_NONE) {
            inode_table[inumber].nodeType = nType;
            
            pthread_rwlock_init(&inode_table[inumber].lock,NULL);
            inode_table[inumber].lock = PTHREAD_RWLOCK_INITIALIZER;

            if (nType == T_DIRECTORY) {
                /* Initializes entry table */
                inode_table[inumber].data.dirEntries = malloc(sizeof(DirEntry) * MAX_DIR_ENTRIES);
                
                for (int i = 0; i < MAX_DIR_ENTRIES; i++) {
                    inode_table[inumber].data.dirEntries[i].inumber = FREE_INODE;
                }
            }
            else {
                inode_table[inumber].data.fileContents = NULL;
            }
            return inumber;
        }
    }
    return FAIL;
}

函数做什么无关紧要的是,在初始化锁的行中有一个奇怪的错误

错误

fs/state.c: In function ‘inode_table_init’:
fs/state.c:34:31: error: expected expression before ‘{’ token
         inode_table[i].lock = PTHREAD_RWLOCK_INITIALIZER;
                               ^
fs/state.c: In function ‘inode_create’:
fs/state.c:81:41: error: expected expression before ‘{’ token
             inode_table[inumber].lock = PTHREAD_RWLOCK_INITIALIZER;

我们将不胜感激。

解决方法

您不需要这些任务。根据POSIX规范:

在默认的读写锁定属性合适的情况下,宏PTHREAD_RWLOCK_INITIALIZER可用于初始化静态分配的读写锁定。该效果等效于通过调用参数指定为pthread_rwlock_init()的{​​{1}} attr进行的动态初始化,除了不执行任何错误检查。

您只能在变量初始化中使用它,而不能在赋值中使用它。而且,由于它等效于之前的电话,因此即使工作了,也是多余的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。