单核心系统C上的OpenMP可能出现死锁

时间:2018-12-31 16:01:48

标签: c openmp deadlock

我正在学习OpenMP,我想在单核系统上用C理解此代码。 (程序代码不是我的)

#include <stdio.h>
#include <omp.h>

int main()
{
    omp_lock_t lock;
    #pragma omp parallel num_threads(2)
    {
        #pragma omp single
        {
            omp_init_lock(&lock);
            omp_set_lock(&lock);

            #pragma omp task
            {
                omp_set_lock(&lock);
                printf("task = 0, thread = %d\n", omp_get_thread_num());
            }

            #pragma omp task
            {
                printf("task = 1, thread = %d\n", omp_get_thread_num());
                omp_unset_lock(&lock);
            }
        } // end of single region, implicit bar & TSP=Tasking Sync Point
    } // end of parallel region, implicit bar
}

在下文中,printf的调用分别称为task0task1

  • 僵局在这里如何发生?

这里我有2个两个线程,据我所知,如果我有一个单核系统,则一次只能有一个线程“工作”(在这种情况下,请忽略每个核心的“物理”线程) ,我不知道该如何称呼)。 此示例的目的是必须在task1之前创建task0,但是必须在task0之前执行task1。

文本中的注释说明可以进行线程切换(这到底是什么意思?我猜想,如果线程0在工作,那么即使线程0没有完成工作也可以安排线程1),并且没有任务切换(这意味着如果线程0执行t0,那么它将永远不会执行t1?并且如果线程1执行t1,那么它也会在t1上被“阻塞”,直到完成为止。如果是这样,为什么会这样呢?我们在一个核心系统上)

我也不清楚在第一个任务之前甚至在task0内部是否有双omp_set_lock(&lock)

0 个答案:

没有答案