Linux kernel SMP linux内核中的障碍

Linux kernel SMP linux内核中的障碍,linux-kernel,Linux Kernel,SMP Linux内核中是否存在类似smth的pthread_屏障 当内核同时在2个或更多具有相同结构的CPU上工作时,屏障(如pthread_屏障)可能很有用。它将停止所有进入它的CPU,直到最后一个CPU运行屏障。从这一刻起,所有的CPU都会重新工作。我不熟悉pthread_barrier()构造,但是内核有大量的内存屏障选项 有关文档,请参阅 如果您试图强制一组线程互相等待,您可能可以使用互斥锁和/或等待队列一起破解某些东西——尽管我不确定您何时会想这么做。你什么时候希望线程互相等待?我现

SMP Linux内核中是否存在类似smth的pthread_屏障


当内核同时在2个或更多具有相同结构的CPU上工作时,屏障(如pthread_屏障)可能很有用。它将停止所有进入它的CPU,直到最后一个CPU运行屏障。从这一刻起,所有的CPU都会重新工作。

我不熟悉pthread_barrier()构造,但是内核有大量的内存屏障选项

有关文档,请参阅


如果您试图强制一组线程互相等待,您可能可以使用互斥锁和/或等待队列一起破解某些东西——尽管我不确定您何时会想这么做。你什么时候希望线程互相等待?我现在很好奇…

您可能可以使用补全得到相同的行为:

struct fake_barrier_t {
  atomic_t count;
  struct completion comp;
}

/* run before each pass */
void initialize_fake_barrier(struct fake_barrier_t* b)
{
  atomic_set(&b->count, 0);
  init_completion(&b->comp);
}

/* make all tasks sleep until nth arrives, then wake all. */
void fake_barrier(struct fake_barrier_t* b, int n)
{
  if (atomic_inc_return(&b->count) < n)
    wait_for_completion(&b->comp);
  else
    complete_all(&b->comp);
}
struct-fake\u-barrier\t{
原子计数;
结构完成公司;
}
/*每次传球前都要跑*/
无效初始化伪屏障(结构伪屏障)
{
原子集(&b->计数,0);
初始完成(&b->comp);
}
/*让所有任务睡眠到第n个到达,然后唤醒所有任务*/
无效假屏障(结构假屏障,int n)
{
if(原子包含返回(&b->count)comp);
其他的
全部完成(&b->comp);
}

但是对于lxr mem bar link,thnx是一个很好的答案。我在想这样的事情,但你实际上实现了它;这实际上是一种实施壁垒的干净方法。