实行两级锁

implement two level lock

本文关键字:两级      更新时间:2023-10-16

我写了一个dll来在内存中存储一些信息,有很多线程想要同时访问数据,所以我使用读/写锁来同步。然后导出有些函数给用户,在函数中,我需要锁,然后获取数据,然后退出然后松开锁。例如,像下面这个函数:

void GetData(data)
{
    //require lock
    //get data
    //release lock
}

我的用户可能会多次调用GetData函数,例如

void ProcessData()
{
    // do something 1
    GetData(data1);
    // do something 2
    GetData(data2);
    ...
}
同时,其他线程可能通过调用我的dll的其他导出函数来改变我的dll中的数据,所以数据可能在GetData(data)之间发生变化;和GetData (data2);但是我的用户希望我的数据永远不会在ProcessData改变,因为在这种情况下data1可能与data2相关。我不想暴露dll中的锁。有没有办法实现这样的东西,谢谢!

您希望人们能够在ProcessData运行时写入数据吗?或者应该阻止写的人直到ProcessData完成?

如果是,那么你可以导出两个函数,让ProcessData锁定任何写入器。

LockOutWriters() { // lock }
WriteData() { // blocks if above is locked }
UnLockWriters() { // unlock }

如果没有,那么您需要在调用GetData()时获取数据快照,并确保每当ProcessData调用GetData时,它都会从该快照中提取数据。