C 错误:在‘之前应为表达式;pthread rw_锁中的{&x2019;令牌

C 错误:在‘之前应为表达式;pthread rw_锁中的{&x2019;令牌,c,pthreads,posix,C,Pthreads,Posix,我有一个数据结构中的节点代码,这个节点有一个读写锁 为了初始化锁,在使用pthread\u rwlock\u t rwlock=pthread\u rwlock\u初始值设定项之前,我使用了pthread\u rwlock\u init 问题是出于某种原因,它给出了一个错误,说它应该是PTHREAD\u RWLOCK\u初始值设定项之前的表达式,我不明白它是什么,因为我知道我没有遗漏任何表达式 代码: 任何帮助都将不胜感激。您不需要这些任务。根据POSIX规范: 在默认读写锁属性合适的情况下,可

我有一个数据结构中的节点代码,这个节点有一个读写锁 为了初始化锁,在使用pthread\u rwlock\u t rwlock=pthread\u rwlock\u初始值设定项之前,我使用了pthread\u rwlock\u init

问题是出于某种原因,它给出了一个错误,说它应该是PTHREAD\u RWLOCK\u初始值设定项之前的表达式,我不明白它是什么,因为我知道我没有遗漏任何表达式

代码:


任何帮助都将不胜感激。

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


在默认读写锁属性合适的情况下,可以使用宏
PTHREAD\u RWLOCK\u初始化器
初始化静态分配的读写锁。其效果相当于通过调用
PTHREAD\u RWLOCK\u init()进行动态初始化
,参数
attr
指定为
NULL
,但不执行错误检查


您只能在变量初始化中使用它,而不能在赋值中使用。而且,由于它相当于以前在行上的调用,所以即使它工作了,它也是多余的。

PTHREAD\u RWLOCK\u初始值设定项
只能在变量初始化中使用,不能在赋值中使用。等等,如果PTHREAD\u RWLOCK\u init already初始化锁?你不会的。这是初始化静态分配锁的一种替代方法,因为你不能在那里调用
pthread\u rwlock\u init
。摆脱分配,它不是必需的。好的,我不知道,谢谢
#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;