---
title: kupl_egroup_fork_barrier
description: "本接口提供一种非全局强制同步的同步语义，仅保证部分同步逻辑，具体表现在："
url: https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/devg/KunpengHPCKit_developer_130.html
sourcePath: /source/zh/kunpenghpcs/hpckit/devg/KunpengHPCKit_developer_130.html
indexId: 966998b22a8f56baceeef8a5c94ca3bc3012d25b265bc53e9d4794d873a3f67867
---
# kupl_egroup_fork_barrier

本接口提供一种非全局强制同步的同步语义，仅保证部分同步逻辑，具体表现在：

对于调用该接口的所有线程，主线程不阻塞，直接往下执行；子线程阻塞等待主线程到达后，才继续往下执行。

#### 接口定义

void kupl_egroup_fork_barrier(kupl_egroup_h group);


#### 参数


**表1 参数定义**

| 参数名 | 类型 | 描述 | 输入/输出 |
| --- | --- | --- | --- |
| group | kupl\_egroup\_h | 执行fork barrier操作的egroup对象 | 输入 |


#### 示例

```
#include <stdio.h>
#include "kupl.h"

static inline void task_int_loop(kupl_nd_range_t *nd_range, void *args, int tid, int tnum)
{
    printf("before barrier: tid %d \n", tid);
    kupl_egroup_join_barrier(nullptr);
    kupl_egroup_fork_barrier(nullptr);
    printf("after barrier: tid %d \n", tid);
}

int main()
{
    const int num_threads = kupl_get_num_executors();
    int executors[num_threads];
    for (int i = 0; i < num_threads; i++) {
        executors[i] = i;
    }
    kupl_egroup_h eg = kupl_egroup_create(executors, num_threads);
    kupl_parallel_for_desc_t desc = {
        .field_mask = KUPL_PARALLEL_FOR_DESC_FIELD_DEFAULT,
        .range = nullptr,
        .egroup = eg,
        .concurrency = num_threads,
        .policy = KUPL_LOOP_POLICY_STATIC
    };
    kupl_parallel_for(&desc, task_int_loop, nullptr);
    kupl_egroup_destroy(eg);
    return 0;
}
```


运行结果如下。

```
before barrier: tid 2
before barrier: tid 0
before barrier: tid 1
before barrier: tid 3
after barrier: tid 1
after barrier: tid 0
after barrier: tid 2
after barrier: tid 3
```

上述示例演示了在并行区域中kupl_egroup_fork_barrier函数的作用。根据运行结果，所有线程的before barrier打印完毕后，所有线程的after barrier才开始打印。由此，kupl_egroup_fork_barrier函数的作用是主线程executor到达该位置后，子线程executor行为才继续执行；此处与kupl_egroup_join_barrier函数搭配使用，实现egroup中所有executor的同步。
