gpt4 book ai didi

c - 3by3线程同步: how to avoid overhead

转载 作者:行者123 更新时间:2023-12-03 12:52:40 29 4
gpt4 key购买 nike

假设我正在运行N个线程。
每个线程都需要与下一个和上一个同步。

    for (i = 0 ; i < NITER; i++){
do_something ();
sync_with_neighbours (tId - 1, tId + 1);
}

我需要以最有效的方式实现同​​步。
Pthread屏障效率不高,因为这种方式每个线程都会等待最慢的线程到达屏障。

任何想法都将受到欢迎

编辑:

不,我们不必等待线程0:

如果这两个邻居线程“i + 1”和“i-1”已准备就绪,则线程“i”将运行。

假设在时间T,我们正在运行6个线程:
  • th0:待处理(运行iter = m)
  • th1:待处理(运行iter = m)
  • th2:准备就绪(等待)
  • th3:准备就绪(等待)
  • th4:准备就绪(等待)
  • th5:待处理(运行iter = m)

  • T + 1的情况将是:
  • th0:待处理(运行iter = m)
  • th1:待处理(运行iter = m)
  • th2:准备就绪(等待)
  • th3:运行iter = m +1
  • th4:准备就绪(等待)
  • th5:待处理(运行iter = m)

  • 因此,如您所见,无需每个人都等待Th0

    最佳答案

    我假设(按照您的示例)您的意思是通过同步化没有真正的交会,而是交叉信号。因此,如果每个线程都得到每个邻居的空闲信号,那么任何线程都可以运行。
    为此,您可以使用信号量,每个线程一个。
    同步部分如下所示:

       UP(left_sem)
    UP(right_sem)
    DOWN(own_sem,2)

    (分别是,第一个和最后一个线程没有左或右邻居。因此,它们只需要一个简单的 DOWN)

    关于实现:经典的System V信号量似乎是适当的,因为System V系统调用已经处理了信号量数组,因此您只需要执行一些索引操作即可。
    但是,每种信号量都应该足够。

    关于c - 3by3线程同步: how to avoid overhead,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13656005/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com