c - 一种用互斥量同步读取和修改的方法

标签 c thread-safety

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

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

这是我的简单代码。但是,它看起来很尴尬,而且也不是线程安全的。 我怎样才能实现这种同步?

最佳答案

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

关于c - 一种用互斥量同步读取和修改的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50695297/

相关文章:

java - 线程问题..内部类..字段

线程可以在不锁定的情况下写入同一结构数组的不同元素吗?

c - 2个程序从端口获取相同的udp数据包

使用 Inline/C 从 Perl 调用外部 C 函数(在共享库中)不起作用

c - H264解码使用ffmpeg

c - 显示 *argv 除了第一个参数

c# - 在后台工作线程中使用 C# 全局变量是否安全

c - C代码获取Lua中加载的变量列表

c++ - 静态对象的同步

java - 使用信号量时程序线程挂起