注册 登录
编程论坛 VC++/MFC

多线程的一个疑问

邵帅 发布于 2014-05-14 11:39, 503 次点击
问题描述:有一个链表,里面的数据我需要处理,链表里的数据是从外界传来的,添加到链表尾。我开了一个线程来对链表里的数据进行处理,从链表的头开始,只有有数据就处理(用的死循环),处理后就删除链表头。
因为链表是共享变量,因此需要用线程同步。问题是一个是主线程,一个是工作线程,线程同步会不会造成程序主线程很卡?另外如果我再开一个线程来完成向链表添加数据,那么由于外界传来数据是很频繁的,就有可能建立好多个线程,既占用了太多资源,同时也降低了程序的性能。

求解答!
2 回复
#2
yuccn2014-05-16 12:14
如果加锁,是有可能卡的,如果你控制的好,卡的时间就可以忽略了。

主线程加入处理的接点item {
  lock() //锁链表  
  list.add(item); // 加入要处理的节点(item)到链表
  unlock() // 解锁


工作线程 {
   while (true) {
       item = NULL
       lock()
       if (list not empty) {
          item = list.remove();// 移除待工作的项,你自己根据自己需求确定移除 是头还是尾部item 就行了。返回item。
       }
       unlock();

        if (item != NULL) {
           dosomething(item); 处理数据
        }


    }


注意红色的部分,如果这部分工作很慢,那么这块就不应该放在lock 到unlock 之间了。

如果你的链表设计的很好(链表的插入一个Item和删除是很快的)。那么主界面卡的那个时间用户是感受不到的

[ 本帖最后由 yuccn 于 2014-5-16 12:16 编辑 ]
#3
邵帅2014-05-17 16:17
回复 2 楼 yuccn
多谢。
我也是采用这样的方法,发现效果还可以。因为工作线程里面对元素的处理也是很快的。
1