如果我有一个线程写作和许多阅读,我怎么才能在写作时锁定,而不是阅读?

时间:2015-11-26 19:30:17

标签: c linux multithreading caching pthreads

所以我把这个结构放到了一个缓存我写的:

struct scache {
        char* rp;
        int ce;
        char* code;
        struct headers* headers;
        struct body* body;
};

struct dcache {
        unsigned char md5[16];
        struct scache scache;
};

struct cache {
        struct scache** scaches;
        size_t scache_size;
        struct dcache** dcaches;
        size_t dcache_size;
};

struct scache* getSCache(struct cache* cache, char* rp, int ce);

struct dcache* getDCache(struct cache* cache, char* rp, int ce, unsigned char* md5);

int addSCache(struct cache* cache, struct scache* scache);

int addDCache(struct cache* cache, struct dcache* dcache);

我想使用互斥锁,以便在我写作时不允许任何读取,但没有读取阻止其他读取。因此读取线程不会相互阻塞,但如果添加一个,它将阻止其他写入和读取。

我研究了互斥体,但我无法理解如何实现这一权利。我想我可以锁定写入,但是如果读取的大小比实际大或小,那么在读取或读取过程中,都会导致双缓存或内存损坏问题。

1 个答案:

答案 0 :(得分:3)

你想要的是一个读写锁。根据它们偏向的方式,有不同的实现方式。

两个极端的边界是:

  • 写入立即访问
  • 仅在等待0读取时才写入访问权限

大多数实现都偏向于写入或读取。

对于标准POSIX实施,请参阅:pthread_rwlock_t http://pubs.opengroup.org/onlinepubs/007908799/xsh/pthread_rwlock_init.html