同时执行两个功能

时间:2019-03-26 15:17:43

标签: c

我正在对已排序的双向链表(包含一堆整数ID)进行线性搜索。为此,我使用分配给head的临时指针(保留dbl的第一个值),然后继续执行下一个指针,直到找到请求的ID。

为了缩短搜索时间,我可以将另一个指针分配给tail(持有最后一个值的指针),并与前一个指针一起向后前进

我的线性搜索实现

struct node* find(long int value) { 
    struct node*temp = head, *temp1 = tail;
    while(temp->id < value && temp1->id > value){
        temp = temp->next;
        temp1 = temp1->prev;
    }
    if(temp->id == value)
        return temp;
    else if(temp1->id == value)
        return temp1;
    else
        return NULL;
}

这里temp1仅在温度向前移动之后才继续向后移动

我的问题:

有没有办法同时移动前向(temp)和向后(temp1)指针?

[我的意思是平行移动两个指针,甚至可以减少共谋的时间]

关键字:双向链表,C语言排序

2 个答案:

答案 0 :(得分:3)

假设您的C实现支持它,则可以包含<threads.h>标头并创建新线程。这将允许您使用一个线程向前扫描列表,而使用另一个线程向后扫描列表。但是,与此相关的问题很多,

  • 如果要检查的节点太多,那么创建一个额外的线程来扫描它们可以显着缩短执行时间,那么您拥有的节点太多,可以通过使用比双向链表更好的结构来改善对它们的搜索,例如树木或哈希。
  • 启动新线程很容易,但是以明智的方式停止线程却很难。当另一个线程找到结果时,您将需要停止一个线程,而当列表中两个线程彼此相遇时,则需要停止两个线程。这意味着要添加更多代码以进行沟通和协调。
  • 在适当的情况下,创建多个线程可以减少“挂钟”的执行时间(直到获得结果为止需要多长时间),但不会减少消耗的资源。您不必使用两个处理器一定的时间,而是要使用两个处理器大约相同的总时间。 (“总计”表示每个处理器上的执行时间之和。)
  • 处理器使用的某些资源是共享的。例如,它们都访问相同的主存储器。根据程序所需的确切资源,让它使用更多处理器可能无济于事。如果程序中的瓶颈正在从内存中读取数据,则第一个处理器无论如何都只是在等待内存,而添加第二个处理器仅意味着它们都在等待。在您是唯一用户并且没有大量使用的系统上,这可能很好(尽管存在这样的问题:以一种方式相对于另一种方式可能会消耗多少能量)。但是,在运行许多进程且需要全部CPU功能的系统上,使用多个进程尽快获得结果可能是浪费的。
  • 相反,现代处理器非常复杂,并且内部包括一些多处理功能—处理器可以在比较某些数据的同时,要求从内存中加载其他数据。有时,聪明的代码编写可以利用这种多处理功能立即完成多项工作。例如,您可以编写在列表中前后交替执行的代码,每个步骤在一个循环中一次同时执行,处理器可以高效地执行此操作,比较一个方向的数据,同时加载另一个方向的数据。

考虑使用并行处理来提高程序速度并不是一个坏主意,但是对于双向链接列表的简单扫描来说,这可能不是正确的方法。除了上面讨论的那些以外,还有其他并发症。

答案 1 :(得分:2)

这样,

C语言不支持同时执行多个功能。唯一的解决方案是多线程。但是,这可能会打开Pandora的框(一个函数如何知道另一个函数在哪里工作?),这可以通过使用关键部分,互斥锁等来解决。这是一个有趣的话题,但是您可能需要做很多阅读工作才能知道使工作正常。