kupl_egroup_join_barrier
本接口提供一种非全局强制同步的同步语义,仅保证部分同步逻辑,具体表现在:
对于调用该接口的所有线程,子线程不阻塞,直接往下执行;主线程阻塞等待所有子线程到达后,才继续往下执行。
接口定义
void kupl_egroup_join_barrier(kupl_egroup_h group);
参数
参数名 |
类型 |
描述 |
输入/输出 |
|---|---|---|---|
group |
kupl_egroup_h |
执行join barrier操作的egroup对象 |
输入 |
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #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_join_barrier函数的作用。根据运行结果,所有线程的before barrier打印完毕后,所有线程的after barrier才开始打印。由此,kupl_egroup_join_barrier函数的作用是子线程executor都到达该位置后,主线程executor行为才继续执行;此处与kupl_egroup_fork_barrier函数搭配使用,实现egroup中所有executor的同步。
父主题: executor相关函数