多线程读写一个TList,读的时候采用共享锁,写的时候用独占的锁,如何实现?

beststone 2006-09-20 10:53:21
多线程读写一个TList,包括增删改读。由于读的时候比较多,写得概率较低。所以
我希望多个线程读的时候采用共享锁,写的时候用独占的锁,如何实现?
这样会不会比全部使用独占的锁提高性能?
谢谢先
...全文
218 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
beststone 2006-09-20
  • 打赏
  • 举报
回复
谢谢明白了。
xiaoshi0 2006-09-20
  • 打赏
  • 举报
回复
TryEnterCriticalSection的意思就是试一下,看能不能获得关键代码段的访问权。

在你的程序中的意思就是现在是否有正在写的?如果有就返回FALSE,如果没有就返回TRUE.

好了,这回你在读的时候判断一下,如果有正在写的,你就别读了,如果没有正在写的,你就读就好了。
beststone 2006-09-20
  • 打赏
  • 举报
回复
仔细看了一下TryEnterCriticalSection的文档,呵呵,明白了,还是自己没看仔细(英文有待提高……),
但是还有一个疑问就是:我在读的时候,一个删除的进程来了,他是否等待写的线程释放资源?还是直接进入临界区删掉某个item。如果这样的话,读的线程对Item的遍历不就产生溢出了吗?
beststone 2006-09-20
  • 打赏
  • 举报
回复
非常谢谢,但是我还是有点不理解。
如果多个线程同时TryEnterCriticalSection的话,也只能有一个线程会成功,其他的返回失败,不知道我这样的理解是否正确。
我希望是可以多个线程同时读,但是写的时候只能有一个线程占用这个list。
wood542344 2006-09-20
  • 打赏
  • 举报
回复
这个是你理解有错了。
读就是读,怎么会删呢?读的时候TryEnterCriticalSection和LeaveCriticalSection配对操作就可以了啊,写的时候才要独占。删、改也是要独占。
beststone 2006-09-20
  • 打赏
  • 举报
回复
谢谢xiaoshi0(Rain) ,
但是由于读的时候我需要用for()循环来读的。如果不加锁在读的中间被删掉一条数据岂不是出现数组溢出?
TryEnterCriticalSection 成功后一样也是独占使得锁定和EnterCriticalSectiony应该没有差别,对吗?
xiaoshi0 2006-09-20
  • 打赏
  • 举报
回复
只有写的时候需要加锁,读的时候不需要。

所以,写的时候可以用EnterCriticalSection和LeaveCriticalSection配对操作,读的时候用TryEnterCriticalSection和LeaveCriticalSection配对操作。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧