返回

多线程的那点儿事(之顺序锁)

发布时间:2023-09-17 15:17:31 195


    在互斥数据访问中有一种多读少写的情况。正对这么一种情形,我们也提出了​​读写锁​​的方案。但是呢,这个锁有些缺陷。什么缺陷呢?那就是,这个写锁需要在所有的读锁完成之后才能写。否则的话,写锁需要这么一直等下去。

    那么,有没有什么办法能使得写操作快速一点进行呢?那就是顺序锁。

typedef struct _SEQUENCE_LOCK
{
unsigned int sequence;
HANDLE hLock;

}SEQUENCE_LOCK;

    有了这么一个数据结构之后。那么读锁怎么开始呢,

unsigned int get_lock_begin(SEQUENCE_LOCK* hSeqLock)
{
assert(NULL != hSeqLock);

return hSeqLock->sequence;
}

int get_lock_retry(SEQUENCE_LOCK* hSeqLock, unsigned int value)
{
unsigned int new_value;
assert(NULL != hSeqLock);

new_value = hSeqLock->sequence;
return (new_value & 0x1) || (new_value ^ value);
}

    自然写锁也需要修改了,

void get_write_lock(SEQUENCE_LOCK* hSeqLock)
{
assert(NULL != hSeqLock);

WaitForSingleObject(hSeqLock->hLock);
hSeqLock->sequence ++;
}

void release_write_lock(SEQUENCE_LOCK* hSeqLock)
{
assert(NULL != hSeqLock);

hSeqLock->sequence ++;
ReleaseMutex(hSeqLock->hLock);
}

    如果应用呢,其实也不难,

void read_process(SEQUENCE_LOCK* hSeqLock)
{
unsigned int sequence;

do{
sequence = get_lock_begin(hSeqLock);
/* read operation */
}while(get_lock_retry(hSeqLock, sequence));
}

void write_process(SEQUENCCE_LOCK* hSeqLock)
{
get_write_lock(hSeqLock);
/* write operation */
release_write_lock(hSeqLock);
}


总结:

    (1)读锁退出有两个条件,要么写操作正在进行呢,要么没有写锁

    (2)写锁之间需要互斥操作

    (3)互斥操作的数据不能是指针,否则有可能在访问的时候会造成异常,因为有可能边写边读

    (4)顺序锁代替不了读写锁,因为读写锁可以保证所有的数据操作,而顺序锁不行


特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
linux下的C语言开发(多线程编程) 2023-09-17 12:02:57