Readers/Writers lock

Readers/Writers lock数据结构:

READWRIT的InitRWLock()

BOOL InitRWLock(RWLock *pLock)

{

pLock->nReaderCount = 0;

pLock->hDataLock = CreateSemaphore(NULL, 1, 1, NULL);

if (pLock->hDataLock == NULL)

return FALSE;

PLock->hMutex = CreateMutex(NULL, FALSE, NULL);

if (pLock->hMutex == NULL)

{

CloseHandle(pLock->hDataLock);

return FALSE;

}

return TRUE;

}

所面对的下一个问题是如何加上错误处理函数,产生一个名为MyWaitForSingleObject()的函数,如下:

BOOL MyWaitForSingleObject(HANDLE hObject)

{

int result;

result = WaitForSingleObject(hObject, MAXIMUM_TIMEOUT);

//Comment this out if you want this to be non-fatal

if (result != WAIT_OBJECT_0)

FatalError("MyWaitForSingleObject - "

"Wait failed,you probably forgot to call release!");

return (result == WAIT_OBJECT_0);

}

READWRIT的ReadOK()和WriteOK()

BOOL ReadOK(RWLock *pLock)

{

//This check is not perfect,because we

//do not know for sure if we are one of this readers

return (pLock->nReaderCount > 0);

}

BOOL WriteOK(RWLock *pLock)

{

DWORD result;

//The first reader may be waiting in the mutex

// but any more than that is an error

if (pLock->nReaderCount > 1)

return FALSE;

//This check is not perfect,because we do not know

//for sure if this thread was the one that hand the

//semaphore locked.

result = WaitForSingleObject(pLock->hDataLock, 0);

if (result == WAIT_TIMEOUT)

return TRUE;

// a count is kept,which was incremented in Wait

result = ReleaseSemaphore(pLock->hDataLock,1,NULL);

if (result == FALSE)

FatalError("WriteOK - ReleaseSemaphore failed");

return FALSE;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-15 01:51:59

Readers/Writers lock的相关文章

用信号量和读写锁解决读者写者问题

读者写者问题是非常经典的同步问题,本文首先用信号量来解决这个问题,并结合代码分析什么是读者优先.什么是写者优先,然后给出读写锁的解决方案,并指出在Linux下读写锁的注意事项. 读者写者问题 读者写者问题描述的是这么一种情况:对象在多个线程(或者进程)之间共享,其中一些线程只会读数据,另外一些线程只会写数据.为了保证写入和读取的正确性,我们需要保证,只要有线程在写,那么其他线程不能读,否则可能读到写了一半的数据:另外,也不能有两个线程同时写,否则导致数据错乱.当然,多个线程是可以同时读数据. 读

Java性能提示(全)

http://www.onjava.com/pub/a/onjava/2001/05/30/optimization.htmlComparing the performance of LinkedLists and ArrayLists (and Vectors) (Page last updated May 2001, Added 2001-06-18, Author Jack Shirazi, Publisher OnJava). Tips: ArrayList is faster than

docker 源码分析 四(基于1.8.2版本),Docker镜像的获取和存储

前段时间一直忙些其他事情,docker源码分析的事情耽搁了,今天接着写,上一章了解了docker client 和 docker daemon(会启动一个http server)是C/S的结构,client端发出的命令由docker daemon接收并处理. 我们在运行docker的时候,可能会使用到docker run命令(当然通过Dockerfile运行docker build命令也是一样的)时,如果本地没有你需要的镜像,docker daemon首先会去下载你需要的docker镜像,然后存

多线程编程之读写锁

在<多线程编程之Linux环境下的多线程(二)>一文中提到了Linux环境下的多线程同步机制之一的读写锁.本文再详细写一下读写锁的概念和原理. 一.什么是读写锁 读写锁(也叫共享-独占锁)实际是一种特殊的自旋锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作.这种锁相对于自旋锁而言,能提高并发性,因为在多处理器系统中,它允许同时有多个读者来访问共享资源,最大可能的读者数为实际的逻辑CPU数.写者是排他性的,一个读写锁同时只能有一个写者或多个读

ExtJS Alias, xtype and widget

Description What is exactly the relationship between these three different concepts? I know that if you alias a class bywidget.name you can later use it by specifying xtype: 'name'. The same class can also be initialized byExt.widget('name'). But wha

如何创建一个Hyperledger Fabric channel

创建channel的步骤: 执行configtxgen tool来生成genesis block: 执行configtxgen tool来生成初始二进制配置定义: 通过以下两种方式获取sign-able channel定义:1)使用初始二进制channel配置定义-使用fabric-client SDK从初始二进制配置定义中解析出sign-able channel定义:2)建立一个定制的定义-使用configtxlator将初始二进制channel配置定义转换成可读文本-编辑可读文本-使用con

Java IO 概述

原文链接作者: Jakob Jenkov   译者: 李璟([email protected])  校对:方腾飞 在这一小节,我会试着给出Java IO(java.io)包下所有类的概述.更具体地说,我会根据类的用途对类进行分组.这个分组将会使你在未来的工作中,进行类的用途判定时,或者是为某个特定用途选择类时变得更加容易. 输入和输出 – 数据源和目标媒介 术语“输入”和“输出”有时候会有一点让人疑惑.一个应用程序的输入往往是另外一个应用程序的输出.那么OutputStream流到底是一个输出到

T31P电子秤数据读取

连接串口后先发送"CP\r\n"激活电子秤数据发送,收到的数据包是17字节的 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DotNet.ElecScales { using System.IO.Ports; using System.Text; using System.Threading; /// <summary> ///

java7 API详解

Java™ Platform, Standard Edition 7API Specification This document is the API specification for the Java™ Platform, Standard Edition. See: Description Packages  Package Description java.applet Provides the classes necessary to create an applet and the