Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 需要混合信号量/循环屏障_Multithreading_Concurrency_Semaphore_Cyclicbarrier - Fatal编程技术网

Multithreading 需要混合信号量/循环屏障

Multithreading 需要混合信号量/循环屏障,multithreading,concurrency,semaphore,cyclicbarrier,Multithreading,Concurrency,Semaphore,Cyclicbarrier,我正在开发一个分阶段作业系统,该系统目前的工作方式如下: cyclicbarrier.init(numthreads) on each thread: for each stage s: loop forever: pop job from joblist[s] if no job: break execute job wait at cyclicbarrier 这将导致该阶段中的所有作业在进入下一阶段之前完成执行 cyc

我正在开发一个分阶段作业系统,该系统目前的工作方式如下:

cyclicbarrier.init(numthreads)
on each thread:
  for each stage s:
    loop forever:
      pop job from joblist[s]
      if no job:
        break
      execute job
    wait at cyclicbarrier
这将导致该阶段中的所有作业在进入下一阶段之前完成执行

cyclicbarrier使用两个信号量实现:

sem1(0)
sem2(0)
n = 0

function wait:
  if atomic_incr(n) == maxthreads:
    sem1.signal(maxthreads)
  sem1.wait()

  if atomic_decr(n) == 0:
    sem2.signal(maxthreads)
  sem2.wait()
我想添加对作业的支持,以便能够将1个或多个作业添加到当前正在运行的阶段,并在阶段继续之前执行这些作业。上面的代码可以做到这一点,但是如果在线程到达障碍后添加此作业,那么它将以次优方式执行,因为等待的线程可以执行它,但不能执行

我将问题归结为需要一种混合信号量/循环载体,为了方便起见,我将其称为Sembrier。下面是它的工作原理:

function wait:
  n--
  if n < 0 and n > -maxthreads:
    suspend until signaled
  else if n <= -maxthreads:
    signal(maxthreads)
为每个阶段创建一个安全屏障:

n = num_theads
for each stage s:
  sembarrier[s].init(0, n)
这将是修改后的循环,使用sembarrier阵列:

此外,添加到作业列表时:

问题:

1我如何有效地实施sembarrier?我可以访问基本的并发结构,比如互斥和信号量。我也有标准的原子行动

2.我原来的问题有没有其他解决办法

谢谢

n = num_theads
for each stage s:
  sembarrier[s].init(0, n)
on each thread:
  for each stage s:
    loop forever:
      sembarrier[s].wait()
      pop job from joblist[s]
      if no job:
        break;
      execute job
function AddJob(stage s, job j):
  joblist[s].push(j)
  sembarrier[s].signal()