9
回答
多线程处理 同一队列的问题,请各位赐教
华为云实践训练营,热门技术免费实践!>>>   

我用 linux C 做一个小东西,  需求是这样的,  有一个不定长的 任务列表, 可能会有同时 几个线程处理这个任务列表,处理的时候 每个线程一次只处理一个任务,然后有下面几个问题。

1.任务列表我应该选用哪种结构? 单链表,数组或结构指针?

2.要怎么做到任务的互斥性

<无标签>
举报
冰点123
发帖于5年前 9回/1K+阅
共有9个答案 最后回答: 5年前

引用来自“Lunar_Lin”的答案

考虑锁竞争,最完美的是 每个线程有自己的一个队列。 这样每个锁最多2线程竞争。

我是想知道这个队列用什么结构最合适?链表? 数组? 还是其它什么结构, 暂时只会点点C , C++ 不会,谢谢

--- 共有 2 条评论 ---
Lunar_Lin别想太多. 5年前 回复
Lunar_Lin昏到, 普通的单链表就够用了阿. 根据自己的需求 可能再复杂点吧. 一般都是双链表. 5年前 回复

1.存储容器有很多种,可以用链表和数组。链表好控制,可以不限制长度。

数组有固定长度,如果放入任务时数组已经满了,可能要做动态扩容处理或者直接返回错误。链表无此限制。

数组还要考虑循环访问的问题。

如果要使数据同步,就加锁,每条队列一个锁,往里写任务或者读任务都需要加锁。

想要做得更高效,节省更多加锁解锁时间,可以用双缓冲队列,或者是无锁队列(无锁队列比较复杂,但是是可以做到的)

如果你的任务有优先级,可能就要实现优先级队列了,这个可能要用到最小堆或者最大堆数据结构。双堆栈也可做到,但是实现较复杂。效率也稍微低一点。

更复杂一点,要实现线程或者任务调度工作,就要考虑更复杂的机制了,而且要专门开发相应管理模块。

楼主,如果你连@远山如此 的LIST是什么都不清楚,建议你还是退一步,把数据结构掌握的更深点。

关于进程之间的交互,重点在于互斥和共享上。而对于存储结构,应该以越简单的方式越好为原则。当然堆栈的方式往往行不通。通常LIST方式是最常用的。而@远山如此 说的是对的,而且不强调LIST的实现方式也是对的。如果说最简单的方式,那么就是固定数组空间循环方式做队列。

引用来自“中山野鬼”的答案

楼主,如果你连@远山如此 的LIST是什么都不清楚,建议你还是退一步,把数据结构掌握的更深点。

关于进程之间的交互,重点在于互斥和共享上。而对于存储结构,应该以越简单的方式越好为原则。当然堆栈的方式往往行不通。通常LIST方式是最常用的。而@远山如此 说的是对的,而且不强调LIST的实现方式也是对的。如果说最简单的方式,那么就是固定数组空间循环方式做队列。

好吧,我承认我确实不理解他说的LIST 到底是什么形式的,学的语言比较多,LIST的理解也是不同,所以还是说学名来得方便

引用来自“xinzaibing”的答案

1.存储容器有很多种,可以用链表和数组。链表好控制,可以不限制长度。

数组有固定长度,如果放入任务时数组已经满了,可能要做动态扩容处理或者直接返回错误。链表无此限制。

数组还要考虑循环访问的问题。

如果要使数据同步,就加锁,每条队列一个锁,往里写任务或者读任务都需要加锁。

想要做得更高效,节省更多加锁解锁时间,可以用双缓冲队列,或者是无锁队列(无锁队列比较复杂,但是是可以做到的)

如果你的任务有优先级,可能就要实现优先级队列了,这个可能要用到最小堆或者最大堆数据结构。双堆栈也可做到,但是实现较复杂。效率也稍微低一点。

更复杂一点,要实现线程或者任务调度工作,就要考虑更复杂的机制了,而且要专门开发相应管理模块。

多谢提点这么多,对c 处于学习阶段,您讲到的这些将是我接下来要学习的东西!
顶部