有一个链表 里面存放了很多对象。
每个对象都有多个方法 但有一个相同的方法(比如close方法) 也就是调用该方法以后该对象就无效了 就从链表里头删除了
我现在是对整个列表做了一个互斥 这个互斥从 查找链表之前开始 到 查找完链表元素 并调用元素的方法以后结束
这样没有什么问题。。但是明显效率不好
我想从查找链表元素开始 到查找链表结束做个互斥 调用元素方法就不在互斥代码里头了
但是这样只有一种情况会出问题
比如我查找完毕以后 调用某个方法 比如read 此时另一个线程也查找链表但是调用close方法。。此时程序运行就出错了
因为read正在执行 但是close已经把对象析构掉了。。
下面给个例子代码
没有问题但是效率底的
map<int,Object *> map; lock();
object *po = map.find(1);
if (po != NULL)
{
po->read();
//po->close(); 进行该操作会调用map.easer操作 删除对象。
}
unlock();map<int,Object *> map;
lock();
object *po = map.find(1);
unlock();
po ->read();
//po->close(); 如果一个线程查找调用read没有结束时,另一个线程查找调用close程序就会崩了。。
每个对象都有多个方法 但有一个相同的方法(比如close方法) 也就是调用该方法以后该对象就无效了 就从链表里头删除了
我现在是对整个列表做了一个互斥 这个互斥从 查找链表之前开始 到 查找完链表元素 并调用元素的方法以后结束
这样没有什么问题。。但是明显效率不好
我想从查找链表元素开始 到查找链表结束做个互斥 调用元素方法就不在互斥代码里头了
但是这样只有一种情况会出问题
比如我查找完毕以后 调用某个方法 比如read 此时另一个线程也查找链表但是调用close方法。。此时程序运行就出错了
因为read正在执行 但是close已经把对象析构掉了。。
下面给个例子代码
没有问题但是效率底的
map<int,Object *> map; lock();
object *po = map.find(1);
if (po != NULL)
{
po->read();
//po->close(); 进行该操作会调用map.easer操作 删除对象。
}
unlock();map<int,Object *> map;
lock();
object *po = map.find(1);
unlock();
po ->read();
//po->close(); 如果一个线程查找调用read没有结束时,另一个线程查找调用close程序就会崩了。。
我说的不是让你给成员变量加锁,而是在对象体内包含一个CEvent、CMutex、CCriticalSection之类的成员变量,然后在所有操作中,都先对该变量lock,操作完成后再unlock。
这个操作加上互斥。由于 删除结点,就是修改了你要保护的东西,所以要加锁。然后,单独调用 被带出的对象的close函数
(你也可以把多个 删除的结点都放到另一个新链表里,再用一个函数,统一删除)