C 两个函数同时执行

C 两个函数同时执行,c,C,我在一个排序的双链接listholds整数ID堆上进行线性搜索。为此,我使用一个临时指针,将dbl的第一个值分配给headholds,然后继续下一个指针,直到找到请求的ID为止 为了缩短搜索时间,我可以将另一个指针分配给tailpointer,该指针保留最后一个值,并与前一个指针一起向后移动 线性搜索的实现 struct node* find(long int value) { struct node*temp = head, *temp1 = tail; while(temp

我在一个排序的双链接listholds整数ID堆上进行线性搜索。为此,我使用一个临时指针,将dbl的第一个值分配给headholds,然后继续下一个指针,直到找到请求的ID为止

为了缩短搜索时间,我可以将另一个指针分配给tailpointer,该指针保留最后一个值,并与前一个指针一起向后移动

线性搜索的实现

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;
}
这里,只有在temp向前移动之后,temp1才会向后移动

我的问题:

有没有办法同时移动forwardtemp和backwardtemp1指针

[我的意思是平行移动两个指针,以减少协作时间]


关键词:排序双链表,C语言不支持同时执行多个函数,因此。唯一的解决方案是多线程。然而,这可能会打开潘多拉的盒子——一个函数如何知道另一个函数在哪里工作?使用关键部分、互斥体等解决该问题。。。。这是一个有趣的话题,但在你开始工作之前,你可能会读很多书。

C语言不支持同时执行多个函数,因此。唯一的解决方案是多线程。然而,这可能会打开潘多拉的盒子——一个函数如何知道另一个函数在哪里工作?使用关键部分、互斥体等解决该问题。。。。这是一个有趣的主题,但在开始工作之前,您可能会阅读很多内容。

如果您的C实现支持它,您可以包含头并创建新线程。这将允许您使用一个线程向前扫描列表,另一个线程向后扫描列表。但是,这方面存在一些问题,包括:

如果要检查的节点太多,创建一个额外的线程来扫描它们可以显著缩短执行时间,那么您就有太多的节点,可以通过使用比双链表更好的结构(如树或哈希)来改进对它们的搜索。 启动一个新线程是相当容易的,但是以一种合理的方式停止线程则比较困难。当另一个线程发现结果时,您需要停止一个线程,当两个线程在列表中相遇时,您需要停止这两个线程。这意味着添加更多用于通信和协调的代码。 在适当的情况下,创建多个线程可以减少“挂钟”执行时间(直到得到结果为止),但不会减少所消耗的资源。与在一定时间内使用一个处理器不同,您将在大约相同的总时间内使用两个处理器。“总计”是指每个处理器上执行时间的总和。 处理器使用的一些资源是共享的。例如,它们都访问相同的主内存。根据您的程序需要的资源,让它使用更多处理器可能没有帮助。如果程序中的瓶颈是从内存读取数据,那么第一个处理器只是在等待内存,而添加第二个处理器只意味着它们都在等待。在一个系统中,如果您是唯一的用户,并且没有大量使用它,那么这可能很好,尽管存在这样或那样做可能会消耗多少能量的问题。然而,在一个有许多进程在运行并且需要全部CPU能力的系统上,使用多个进程来更快地获得结果可能是浪费。 相反,现代处理器非常复杂,内部包含一些多重处理——处理器可以在要求从内存加载其他数据的同时比较一些数据。有时,巧妙地编写代码可以利用这种多重处理,一次完成多项任务。例如,您可以编写交替在列表中向前和向后工作的代码,在一个循环中每次执行一个步骤,处理器可以高效地执行此操作,比较一个方向的数据,同时加载另一个方向的数据。
考虑使用并行处理来加速程序不是一个坏主意,但对于简单扫描双链表来说,这可能不是正确的方法。除了上面讨论的以外,还有其他复杂问题。

如果您的C实现支持它,您可以包括头并创建新线程。这将允许您使用一个线程向前扫描列表,另一个线程向后扫描列表。但是,这方面存在一些问题,包括:

如果要检查的节点太多,创建一个额外的线程来扫描它们可以显著缩短执行时间,那么您就有太多的节点,可以通过使用比双链表更好的结构(如树或哈希)来改进对它们的搜索。 开始一个新的线程是相当容易的,但很难实现 以合理的方式停止线程。当另一个线程发现结果时,您需要停止一个线程,当两个线程在列表中相遇时,您需要停止这两个线程。这意味着添加更多用于通信和协调的代码。 在适当的情况下,创建多个线程可以减少“挂钟”执行时间(直到得到结果为止),但不会减少所消耗的资源。与在一定时间内使用一个处理器不同,您将在大约相同的总时间内使用两个处理器。“总计”是指每个处理器上执行时间的总和。 处理器使用的一些资源是共享的。例如,它们都访问相同的主内存。根据您的程序需要的资源,让它使用更多处理器可能没有帮助。如果程序中的瓶颈是从内存读取数据,那么第一个处理器只是在等待内存,而添加第二个处理器只意味着它们都在等待。在一个系统中,如果您是唯一的用户,并且没有大量使用它,那么这可能很好,尽管存在这样或那样做可能会消耗多少能量的问题。然而,在一个有许多进程在运行并且需要全部CPU能力的系统上,使用多个进程来更快地获得结果可能是浪费。 相反,现代处理器非常复杂,内部包含一些多重处理——处理器可以在要求从内存加载其他数据的同时比较一些数据。有时,巧妙地编写代码可以利用这种多重处理,一次完成多项任务。例如,您可以编写交替在列表中向前和向后工作的代码,在一个循环中每次执行一个步骤,处理器可以高效地执行此操作,比较一个方向的数据,同时加载另一个方向的数据。

考虑使用并行处理来加速程序不是一个坏主意,但对于简单扫描双链表来说,这可能不是正确的方法。除了上面讨论的那些,还有其他的复杂问题。

您听说过多线程吗?没有,除非语言允许并行,并且执行并行操作不会花费更长的时间来按顺序执行这两个步骤。@PSkocik我不熟悉这个概念。我很想学习it@jdweng我使用的是c语言为什么不让指针指向所有节点并同时检查它们?你听说过多线程吗?没有,除非该语言允许并行,并且执行并行操作不会比按顺序执行这两个步骤花费更长的时间。@PSkocik我不熟悉这个概念。我很想学习it@jdweng我正在使用c语言为什么不让指针指向所有节点并同时检查它们?c支持通过线程同时执行多个函数。头是标准的,尽管是可选的。互斥和互锁操作会花费大量时间并删除处理器缓存。因此,只有在较长时间内处理单独的数据块并在其之后累积结果时,多线程才有用。只有这样,同步开销才不会影响性能。@Dominique我可以有两个搜索函数,一个从前面开始搜索,另一个从最后开始搜索。[为了实现并行性,一个函数不需要依赖于您指出的其他函数的行为]C支持通过线程同时执行多个函数。头是标准的,尽管是可选的。互斥和互锁操作会花费大量时间并删除处理器缓存。因此,只有在较长时间内处理单独的数据块并在其之后累积结果时,多线程才有用。只有这样,同步开销才不会影响性能。@Dominique我可以有两个搜索函数,一个从前面开始搜索,另一个从最后开始搜索。[为了实现并行性,一个函数不需要依赖于您指出的其他函数的行为]感谢您的洞察力。因此,如果一个函数在另一个函数之前找到地址,那么停止另一个线程会很困难吗?@user8570772:从编写代码的意义上讲,这并不困难;我们知道如何做这些事情。但这意味着我们必须让计算机做额外的管理工作,与线程通信,调用其退出例程,等等。这只是一个额外的成本,必须考虑到是否值得创建一个额外的线程。感谢您的洞察力。因此,如果一个函数在另一个函数之前找到地址,那么停止另一个线程会很困难吗?@user8570772:从编写代码的意义上讲,这并不困难;我们知道如何做这些事情。但这意味着我们必须让计算机做额外的管理工作,与线程通信,调用其退出例程,等等。这只是一个额外的费用 必须考虑到是否值得创建一个额外的线程。