请教多线程加锁的问题...

zym_123456 2013-01-13 09:55:51

struct MSG // 消息结构体
{
int nData;
...;
}

class CMsgList // 消息列表封装类
{
public:
MSG * GetMsg(int nIndex);
BOOL AddMsg(MSG * pMsg);
void DelMsg(int nIndex);
BOOL ModifyMsg(int nIndex, MSG * pMsg);

private:
std::vector<MSG *> arrMsg;
}


假设有两个线程会访问到上面的数据...
一个是主线程需要读取上面的消息列表里面的消息,用来在用户界面显示消息内容...
一个是后台线程要增、删、改上面的消息列表...
请教如何多线程加锁...
...全文
1009 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
rxguoblp 2013-02-06
  • 打赏
  • 举报
回复
引用 6 楼 oyljerry 的回复:
主线程: //获取锁,Wait等待获取 //Lock 访问资源 //UnLock 子线程: //获取锁,Wait等待获取 //Lock 访问资源 //UnLock
++ 讨论过加锁的必要性之后就是加锁的方法问题。加锁的手段有很多,互斥、临界区、事件对象、关键代码段等等。
Kaile 2013-01-31
  • 打赏
  • 举报
回复
多线程访问共享资源,如果有修改的话,必须要加锁。(现在出来一些无锁的数据结构,内部使用原子操作,其实也是硬件级的加锁) 读共享资源用共享锁,写用独占锁,可以提高效率。
「已注销」 2013-01-31
  • 打赏
  • 举报
回复
CMsgList类存在设计缺陷,需要重新设计接口。
zhangyihu321 2013-01-30
  • 打赏
  • 举报
回复
所谓锁锁的是共享数据段操作的互斥,一些函数的数据大部分应该是可重入的。。。
逍遥子_ 2013-01-22
  • 打赏
  • 举报
回复
其实线程加锁的问题是个老问题了,但也不一定所有的多线程都需要加锁,加解锁是很消耗资源的,如果你的程序对一定的错误可以容忍,并且读取消息时又更新的比较快,建议就不要加了。 如果你的消息比较重要,且消耗资源及效率下降时可以忍受的,则可以为资源加锁, 这里有个问题需要注意一下,锁可以和资源封装到一起,一个资源对应一个锁。用到类的时候千万要注意,别让每个对象都有一个锁,这样就起不到加锁作用了。
阿麦 2013-01-15
  • 打赏
  • 举报
回复
class CMsgList // 消息列表封装类 {public: MSG * GetMsg(int nIndex); BOOL AddMsg(MSG * pMsg); void DelMsg(int nIndex); BOOL ModifyMsg(int nIndex, MSG * pMsg); private: CCriticalSection m_Lock; std::vector<MSG *> arrMsg; }; 在GetMsg, AddMsg, DelMsg, ModifyMsg的入口处加锁: m_Lock.Lock(); 记得一定要在函数返回前解锁: m_Lock.Unlock()
zym_123456 2013-01-14
  • 打赏
  • 举报
回复
我的结论是封装不了...
jimette 2013-01-14
  • 打赏
  • 举报
回复
自己尝试一下
zym_123456 2013-01-14
  • 打赏
  • 举报
回复
问题来了,加锁能在对象内部封装吗?给出上面CMsgList类的内部加锁封装...
柔情铁汉h 2013-01-14
  • 打赏
  • 举报
回复
引用 6 楼 oyljerry 的回复:
主线程: //获取锁,Wait等待获取 //Lock 访问资源 //UnLock 子线程: //获取锁,Wait等待获取 //Lock 访问资源 //UnLock
基于面向对象高内聚的目标,资源加锁是在对象内部自己搞定的。对public接口GetMsg addmsg那些,可以使用临界区等加锁使其线程安全。这样不管你多少个线程来调用都没问题。像楼上这样子的,假如再多10条线程岂不是你每条线程都要加上加锁代码?
jixiang1983 2013-01-13
  • 打赏
  • 举报
回复
读的时候不允许写,写的时候不允许读,读写代码分别锁上,完成后释放
hdg3707 2013-01-13
  • 打赏
  • 举报
回复
可以使用CMutex,也可以使用临界区间,在加锁期间一定不要中途退出,如果退出要先解锁再退出,免得死锁,同时要设加锁超时,免得无限期加锁导致死锁
MoreWindows 2013-01-13
  • 打赏
  • 举报
回复
" 一个是主线程需要读取上面的消息列表里面的消息,用来在用户界面显示消息内容... 一个是后台线程要增、删、改上面的消息列表... " 这个问题与读者写者问题非常类似,楼主可以参考下我写的二篇文章: 1. 《秒杀多线程第十一篇 读者写者问题》 http://blog.csdn.net/morewindows/article/details/7596034 2. 《秒杀多线程第十四篇 读者写者问题继 读写锁SRWLock》 http://blog.csdn.net/morewindows/article/details/7650574 希望能对楼主有所帮助。
hdg3707 2013-01-13
  • 打赏
  • 举报
回复
简单,在主线程里凡是读取消息列表前就加锁,一旦读取就立即解锁,然后再显示,后台线程也是这样,操作消息列表前加锁,操作后立即解锁.
oyljerry 2013-01-13
  • 打赏
  • 举报
回复
主线程: //获取锁,Wait等待获取 //Lock 访问资源 //UnLock 子线程: //获取锁,Wait等待获取 //Lock 访问资源 //UnLock
zym_123456 2013-01-13
  • 打赏
  • 举报
回复
大家能不能写上加锁的伪代码...看看加锁的地方对不对...

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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