一种使用互斥锁同步读取和修改的方法

时间:2018-06-05 08:14:03

标签: c thread-safety

我正在实现Web代理服务器缓存的同步。有两种情况:

  1. 如果正在修改缓存,则其他人无法修改 线程
  2. 如果正在读取缓存,则其他人无法修改 线程,但它可以被其他线程读取。
  3. 我想让缓存可读,即使它被其他线程读取。

    int readflag = 0;
    // read
    void read()
    {
        pthread_mutex_lock();
        pthread_mutex_unlock();
        ++readflag;
        /* read the cache*/
        --readflag;
    }
    
    // modify
    void write()
    {
        while(readflag > 0);
        pthread_mutex_lock();
        /* modify the cache*/
        pthread_mutex_unlock();
    }
    

    这是我的简单代码。但是,它似乎很尴尬,也不是线程安全的。 如何实现此同步?

1 个答案:

答案 0 :(得分:0)

Pthreads为此提供了读写锁。

使用pthreads读写锁的示例:

#include <pthread.h>
#include <assert.h>

static pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;

static void read()
{
    int r;
    r=pthread_rwlock_rdlock(&rwlock); 
    assert(0==r); 
    //lock/unlock ops can't fail
    //unless your program's logic is flawed

    /* read the cache*/
    r=pthread_rwlock_unlock(&rwlock); assert(0==r);
}

// modify
static void write()
{
    int r;
    r=pthread_rwlock_wrlock(&rwlock); assert(0==r);
    /* modify the cache*/
    r=pthread_rwlock_unlock(&rwlock); assert(0==r);
}