Способ синхронизации чтения и изменения с мьютексом - PullRequest
0 голосов
/ 05 июня 2018

Я осуществляю синхронизацию кэша веб-прокси-сервера.Существует два случая:

  1. Если кэш изменяется, он не может быть изменен другими потоками
  2. Если кэш читается, он не может быть изменендругие потоки, но могут быть прочитаны другими потоками.

Я хочу сделать кэш читаемым, даже если он читается другими потоками.

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 голосов
/ 05 июня 2018

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);
}
...