c - 一种使用互斥锁同步读取和修改的方法
问题描述
我正在实现 Web 代理服务器缓存的同步。有两种情况:
- 如果缓存正在被修改,则不能被其他线程修改
- 如果缓存正在被读取,则不能被其他线程修改,但可以被其他线程读取。
我想让缓存可读,即使它正在被其他线程读取。
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);
}
推荐阅读
- packet - 如何在痘控制器中阻止数据包?
- swift - Xcode/Swift 代码折叠
- ios - 检测 WebView 何时在 Swift4 中完成加载?
- ethereum - 智能合约能否自动向以太坊区块链中的用户地址发送消息
- google-chrome-extension - 仅在重新启动 Chrome 浏览器后:未发送 chrome.runtime.sendMessage() 或未调用 chrome.runtime.onMessage 侦听器函数
- c++ - 使用windows.h C++时如何避免使用全局变量
- function - 无法从 Ionic 中的 Toast 中读取属性“未定义”的“创建”
- jquery - 我正在尝试使用 ajax jquery 将字符串发布到 Web 服务,但我收到此错误 500 internal server error
- mongodb - 通过 mongoose 使用引用播种 MongoDB 的正确方法
- discord - create_task = asyncio.async: SyntaxError: 无效语法