【问题标题】:Two functions execution at the same time两个函数同时执行
【发布时间】:2019-03-26 15:17:42
【问题描述】:

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

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

我的线性搜索实现

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 向前移动之后

我的问题:

有什么方法可以同时移动向前(temp) 和向后(temp1) 指针?

[我的意思是同时移动两个指针,甚至减少comaprision的时间]

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

【问题讨论】:

  • 你听说过多线程吗?
  • 否,除非语言允许并行,并且执行并行操作不会花费更长的时间,而不是按顺序执行两个步骤。
  • @PSkocik 我是这个概念的新手。很想学习它
  • @jdweng 我用的是c语言
  • 为什么不拥有指向所有节点的指针并同时检查它们?

标签: c


【解决方案1】:

如果您的 C 实现支持它,您可以包含 &lt;threads.h&gt; 标头并创建新线程。这将允许您使用一个线程向前扫描列表,而另一个线程向后扫描列表。但是,这样做存在许多问题,包括:

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

考虑使用并行处理来加速程序并不是一个坏主意,但它可能不是简单扫描双向链表的正确方法。除了上面讨论的问题之外,还有其他并发症。

【讨论】:

  • 感谢您的洞察力。那么如果一个函数先于另一个函数找到地址,是否很难停止另一个线程?
  • @user8570772:嗯,从写代码的意义上来说并不难;我们知道如何做这些事情。但这意味着我们必须让计算机完成额外的管理工作——与线程通信、调用其退出例程等等。这只是一个额外的成本,必须考虑是否值得创建额外的线程。
【解决方案2】:

C 语言不支持同时执行多个函数。唯一的解决方案是多线程。然而,这可能会打开潘多拉的盒子(一个函数如何知道另一个函数在哪里工作?),这是使用临界区、互斥锁等解决的问题。做点什么。

【讨论】:

  • C 确实支持通过线程同时执行多个函数。 &lt;threads.h&gt; 标头是标准的,尽管是可选的。
  • 互斥锁和互锁操作会花费大量时间并丢弃处理器缓存。因此,只有当您处理单独的数据块相对较长时间并在其之后累积结果时,才可以使用多线程。只有这样同步开销才不会影响性能。
  • @Dominique 我可以有两个搜索功能,一个从前面开始搜索,另一个从最后一个开始搜索。[为了实现并行性,一个函数不需要依赖于另一个函数的行为你指出的]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-04
  • 1970-01-01
  • 2017-07-26
  • 1970-01-01
相关资源
最近更新 更多