相关疑难解决方法(0)

可以在Linux上实现正确的故障安全流程共享障碍吗?

在过去的一个问题中,我询问了如何在没有破坏竞赛的情况下实施pthread障碍:

一旦pthread_barrier_wait返回,障碍如何可以销毁?

并且从迈克尔伯尔那里得到了一个完美的流程局部障碍解决方案,但却因流程共享障碍而失败.我们后来研究了一些想法,但从未得出令人满意的结论,甚至没有开始陷入资源失败的情况.

是否有可能在Linux上构建满足这些条件的障碍:

  • 进程共享(可以在任何共享内存中创建).
  • 在屏障等待函数返回后立即从任何线程中取消映射或销毁屏障是安全的.
  • 由于资源分配失败,无法失败.

迈克尔尝试解决流程共享案例(参见链接问题)有一个不幸的特性,即必须在等待时间分配某种系统资源,这意味着等待可能会失败.并且不清楚当障碍等待失败时调用者可以合理地做什么,因为屏障的整个点是在其余N-1线程到达之前继续进行是不安全的......

内核空间解决方案可能是唯一的方法,但即使这很困难,因为信​​号可能会中断等待而没有可靠的方法来恢复它...

c linux posix pthreads barrier

11
推荐指数
1
解决办法
662
查看次数

这种障碍的方法是对的吗?

我发现pthread_barrier_wait非常慢,所以在我的代码中的一个地方我用我的版本的barrier(my_barrier)替换了pthread_barrier_wait,它使用了一个原子变量.我发现它比pthread_barrier_wait快得多.使用这种方法有什么缺陷吗?这是对的吗?另外,我不知道为什么它比pthread_barrier_wait更快?任何线索?

编辑

  • 我主要感兴趣的是线程数相等的核心.

    atomic<int> thread_count = 0;
    
    void my_barrier()
    {     
      thread_count++;
    
      while( thread_count % NUM_OF_THREADS )
       sched_yield();
    }
    
    Run Code Online (Sandbox Code Playgroud)

c c++ multithreading c++11

9
推荐指数
1
解决办法
919
查看次数

什么时候摧毁pthread屏障是否安全?

如果我有一个初始化的pthread_barrier_t,什么时候可以安全地销毁它?以下示例是安全的吗?

pthread_barrier_t barrier;
...
int rc = pthread_barrier_wait(b);
if (rc != PTHREAD_BARRIER_SERIAL_THREAD && rc != 0){
  perror("pthread_barrier_wait");
  exit(1);
}

if (id == 0){
  if(pthread_barrier_destroy(&(threads[t_root].info.tmp_barrier))){
    perror("pthread_barrier_destroy");
    exit(1);
  }
}
Run Code Online (Sandbox Code Playgroud)

c multithreading posix pthreads

6
推荐指数
1
解决办法
3506
查看次数

在 C 中实现线程屏障和屏障重置的正确方法是什么?

我尝试在代码中实现一个简单的屏障,如下所示:

void waitOnBarrier(int* barrier, int numberOfThreads) {
    atomicIncrement(barrier); // atomic increment implemented in assembly
    while(*barrier < numberOfThreads);
}
Run Code Online (Sandbox Code Playgroud)

然后代码中有一个屏障的用法:

int g_barrier = 0; // a global variable

waitOnBarrier(&g_barrier, someKnownNumberOfThreads);
Run Code Online (Sandbox Code Playgroud)

到目前为止一切顺利,但是我应该在哪里将g_barrier变量重置为零?如果我写类似的东西

g_barrier = 0;
Run Code Online (Sandbox Code Playgroud)

在waitOnBarrier调用之后,如果其中一个线程比其他线程更快地从屏障中释放并使 g_barrier 无效,所有其他线程仍在执行循环指令,那么我将遇到一个问题,所以最终它们将永远卡在屏障上。

说明: waitOnBarrier将编译成如下内容(伪代码):

1: mov rax, numberOfThreads
2: mov rbx, [barrier]
3: cmp rax, rbx
4: jmp(if smaller) to 2
Run Code Online (Sandbox Code Playgroud)

因此,如果我们有 2 个线程在屏障上同步,并且thread_1在指令 3 或 4 处速度较慢,而更快的thread_2到达屏障,则通过它并继续进入g_barrier无效流程。这意味着在thread_1到达指令 2 后,它将在 [barrier] 处看到一个零值,并且将永远卡在屏障上! …

c x86 multithreading barrier

5
推荐指数
1
解决办法
1万
查看次数

标签 统计

c ×4

multithreading ×3

barrier ×2

posix ×2

pthreads ×2

c++ ×1

c++11 ×1

linux ×1

x86 ×1