多线程同时访问同一个容器,不用枷锁的方式(C++)

看热闹不嫌_事大 2014-04-24 01:17:15
C++程序,两个线程同时访问一个容器,读的时候同时会往里写,如果枷锁,那么读的时候,就不能写,数据机会丢。如果不加锁,可能会有两个线程同时操作一块内存会有问题。以前试过用列表复制的方式,但是数据很大速度又很慢,有什么容器可以同时读写么?或者这个问题怎么处理才好呢?
...全文
1214 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-05-22
  • 打赏
  • 举报
回复
Synchronization Functions The following functions are used in synchronization. CancelWaitableTimer CreateEvent CreateMutex CreateSemaphore CreateWaitableTimer DeleteCriticalSection EnterCriticalSection GetOverlappedResult InitializeCriticalSection InitializeCriticalSectionAndSpinCount InterlockedCompareExchange InterlockedDecrement InterlockedExchange InterlockedExchangeAdd InterlockedIncrement LeaveCriticalSection MsgWaitForMultipleObjects MsgWaitForMultipleObjectsEx OpenEvent OpenMutex OpenSemaphore OpenWaitableTimer PulseEvent QueueUserAPC ReleaseMutex ReleaseSemaphore ResetEvent SetCriticalSectionSpinCount SetEvent SetWaitableTimer SignalObjectAndWait TimerAPCProc TryEnterCriticalSection WaitForMultipleObjects WaitForMultipleObjectsEx WaitForSingleObject WaitForSingleObjectEx 《Windows核心编程》
就想叫yoko 2014-05-22
  • 打赏
  • 举报
回复
用锁注意以下几点 io操作:文件和网络 计算密集,还有一些系统调用需要切换到内核态的 粒度,尽量减少 碰撞几率,好几个线程都频繁用到 你这个无所谓啦 push_back的时候锁一下,最多是读做处理的时候注意别占用太多时间,如果是的话再弄个vector swap出来就出锁,然后再去做处理
zhangsongcui 2014-05-21
  • 打赏
  • 举报
回复
引用 5 楼 meimaodeyu 的回复:
谢谢各位回答,目前我是这么弄的。 利用vector 同时 读写,没一个线程写,push_back.,另一个读 永远读最开始的那一个,并且读完 pop,将指针下移。虽然看着有点怪怪的,但是基本的需求可以满足了。但是总感觉有风险,毕竟不是 线程安全的。
boost::lockfree::queue 欢迎你 嫌boost太大? No no no,boost::lockfree是完全独立的一个模版库,单独拿出来用即可 或者还有其他并行库,微软的PPL(高版本VS自带),gcc的<parallel/queue.h>,还有intel著名的tbl
zhangsongcui 2014-05-21
  • 打赏
  • 举报
回复
引用 9 楼 FrankHB1989 的回复:
[quote=引用 8 楼 FrankHB1989 的回复:] 按需减少锁的粒度这是基本功。 元素类型足够简单要偷懒就std::vector<std::atomic<XXX>>。
好吧,二了,没法copy constructible还不能直接用,得自己造个wrapper。 puxh_back什么的看来也没直接偷懒的办法。[/quote]
引用 9 楼 FrankHB1989 的回复:
[quote=引用 8 楼 FrankHB1989 的回复:] 按需减少锁的粒度这是基本功。 元素类型足够简单要偷懒就std::vector<std::atomic<XXX>>。
好吧,二了,没法copy constructible还不能直接用,得自己造个wrapper。 puxh_back什么的看来也没直接偷懒的办法。[/quote] std::vector容器本身就不是线程安全的吧。
ningto.com 2014-05-21
  • 打赏
  • 举报
回复
推荐你使用阻塞队列
超级能量泡泡 2014-05-21
  • 打赏
  • 举报
回复
特别的,当你的容器不具备随机存储能力的时候,优化命令队列可以加速遍历速度。
超级能量泡泡 2014-05-21
  • 打赏
  • 举报
回复
如果你的数据很大,一定要用专门的命令队列方式进行处理。弄得好的话还可以优化操作顺序,隐藏高耗时操作的延迟(比如同时读或者写一段内存区域的数据)。
超级能量泡泡 2014-05-21
  • 打赏
  • 举报
回复
建立一个独立的命令队列管理器,并且建数据缓冲和索引缓冲,根据容器的特点,将索引范围、命令分类,有些操作允许同时进行有些操作不许同时进行,不许同时进行的时候加锁。
FrankHB1989 2014-05-18
  • 打赏
  • 举报
回复
引用 8 楼 FrankHB1989 的回复:
按需减少锁的粒度这是基本功。 元素类型足够简单要偷懒就std::vector<std::atomic<XXX>>。
好吧,二了,没法copy constructible还不能直接用,得自己造个wrapper。 puxh_back什么的看来也没直接偷懒的办法。
FrankHB1989 2014-05-18
  • 打赏
  • 举报
回复
按需减少锁的粒度这是基本功。 元素类型足够简单要偷懒就std::vector<std::atomic<XXX>>。
taodm 2014-05-18
  • 打赏
  • 举报
回复
该加锁就必须加锁,别想啥偷懒的招。
mujiok2003 2014-05-18
  • 打赏
  • 举报
回复
引用 5 楼 meimaodeyu 的回复:
但是基本的需求可以满足了。但是总感觉有风险,毕竟不是 线程安全的。
为啥不加锁呢?
  • 打赏
  • 举报
回复
谢谢各位回答,目前我是这么弄的。 利用vector 同时 读写,没一个线程写,push_back.,另一个读 永远读最开始的那一个,并且读完 pop,将指针下移。虽然看着有点怪怪的,但是基本的需求可以满足了。但是总感觉有风险,毕竟不是 线程安全的。
menzi11 2014-04-24
  • 打赏
  • 举报
回复
只有lockfree能救你
Horane 2014-04-24
  • 打赏
  • 举报
回复
如果不求实时性,写个缓冲区,写线程如果能获得主容器的操作权,就连同缓冲区数据一起写入,如果没获得,就往缓冲区写数据,
ztenv 版主 2014-04-24
  • 打赏
  • 举报
回复
不加锁数据不会丢会乱,或莫名的问题;可以减小锁的粒度,当然要自己实现容器
FancyMouse 2014-04-24
  • 打赏
  • 举报
回复
不加锁数据会丢这也是头一回听说,有点莫民。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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