关于多线程操作如何合理上锁的问题 本帖最后由 cpp_crab 于 2010-01-12 10:53:05 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 EnterCriticalSection;LeaveCriticalSection;MSDN吧 使用CRITICAL_SECTION的时候记得要InitialCriticalSection一下 考虑到操作的效率,我现在的处理方式是,获得一个对象A的指针后,链表的锁释放,采用对象内部的锁——锁住对象,这样其他线程可以对链表操作 这种的思路无法解决的一个问题是:线程1获取了一个对象,使用内部锁锁住对象之后,并对该对象进行处理;这时如果线程2遍历链表,发现某个对象可符合删除条件,线程2就会删除该对象,如果线程2删除的对象正好是线程1取走的对象指针,这个时候程序可能会崩溃 按照你的说法,对象A明显是个互斥资源,你上锁的目的是对互斥资源进行保护,但是很显然你加的的锁没有互斥作用,这种做法,你的内部锁没有任何意义,合理的方法是获得一个对象A的指针后,链表的锁不动,知道操作完成同时线程2遍历链表,发现某个对象可符合删除条件,线程2就会删除该对象,在删除前上锁,删除完后释放锁其实 对于线程2中涉及到数据修改的地方先上锁,如果不修改的话只读就不必要上锁如果线程2删除的对象正好是线程1取走的对象指针,这个时候程序可能会崩溃 谢谢各位的回复我的程序大致是这样子的,一个线程处理任务与数据库相关的操作以及将可停止的任务从链表删除,另外一组通信线程(iocp)根据内存中的任务状态响应客户端的请求,并对任务状态进行相应的修改,如果简单化处理的话直接锁住链表,一切都应该是没有问题的,只是处于效率上的考虑,希望可以做一些改进目前打算是,每个任务对象的状态保存在一个数据结构中,如果任务对象的状态是在使用中的话,不允许删除,使用完成之后更新为允许删除,只是这样程序的编写变得较为复杂而已 字符串子串的截取问题 谢谢了! 跪求判断网页能否连接 在ATL写的Windows服务中如何接收其他程序的广播消息 请各位高手过来帮帮小弟的忙,关于获得桌面坐标的问题 一直搞不明白的问题。 二次规划源代码 在VC下直接操作并口的问题。 请问:哪儿可以下载到VC++6.0英文企业版? 大家好!我想打开一个对话框! 窗口编程 MFC 打印预览 放大缩小 的问题 VC 送分了速度~~速度~~
LeaveCriticalSection;MSDN吧
你上锁的目的是对互斥资源进行保护,
但是很显然你加的的锁没有互斥作用,这种做法,你的内部锁没有任何意义,
合理的方法是获得一个对象A的指针后,链表的锁不动,
知道操作完成同时线程2遍历链表,发现某个对象可符合删除条件,
线程2就会删除该对象,在删除前上锁,删除完后释放锁
其实 对于线程2中涉及到数据修改的地方先上锁,
如果不修改的话只读就不必要上锁
如果线程2删除的对象正好是线程1取走的对象指针,这个时候程序可能会崩溃
谢谢各位的回复我的程序大致是这样子的,一个线程处理任务与数据库相关的操作以及将可停止的任务从链表删除,另外一组通信线程(iocp)根据内存中的任务状态响应客户端的请求,并对任务状态进行相应的修改,如果简单化处理的话直接锁住链表,一切都应该是没有问题的,只是处于效率上的考虑,希望可以做一些改进目前打算是,每个任务对象的状态保存在一个数据结构中,如果任务对象的状态是在使用中的话,不允许删除,使用完成之后更新为允许删除,只是这样程序的编写变得较为复杂而已