|
|
|
|
|
|
b***i 发帖数: 3043 | 1 纠正了:先描述一下树:
一个多叶子的树,每个节点有多个下层节点。每一个节点也有一个指针指向同层下一个
节点。这个图无法看,可以复制到notepad上看
1--2--3--4
| | | |
| | | 5
| | | |
| | | 6
| | |
| | 7--8
| | |
| | 9
| | |
| | A
| |
| B--C--D
| | |
| | E
| |
| F--G
| |
| H
|
I--J--K--L
如果要遍历1-2-3-4-5-6-7-8-9-A-B-C-D-E-F-G-H-I-J-K-L,并且进行处理则有如下程序
traverse(head){
if (head->needed){
action(head);
wait(50);
if (quit) return;
if (head->deeper)
traverse(head->deeper);
}
head=head->next;
while(head){
traverse(head);
head=head->next;
}
}
要求多线程化这个遍历过程。假定有一个函数getNext,根据current指针来给出下一个
节点需要处理的节点(如果没有,给出原来节点),那么我的工人线程就是这样的
void worker(){
Node* next = getNext(current);
if (next->needed){
action(next);
wait(50);
current=next;
if (quit) return;
}
}
其他要求:
1 要持续化,就是L之后下一个是1,然后2,接着来。
2 每进行一个action,要等50毫秒
3 不是每个节点都要处理,有的不要处理,由needed决定。不处理的节点不要等50毫秒
4 如果每个节点都不要处理,那么就还是要等50毫秒,不能无限循环下去
5 每次50毫秒等待后,有机会判断是否应该退出线程
6 不需要处理的节点其下层节点都不用处理,但是需要尝试处理其同层下一个节点并继续
我目前想到两个方案:一个是写一个遍历的单步iterator函数getNext,有相应的术语
吗?英文叫什么?另一个是,在原来递归函数traverse的基础上,直接等待,和衔接I-
1。但是我怎么避免无限循环没有想好。
我想getNext应该基于堆栈,那么哪个思路好?
系统是Linux, 用C++11,内存512M,ARM。 |
|
|
|
|
|