Openmp补遗之同步

一、 atomic编译指导语句

指定特殊的存储单元将被原子地更新,不允许多个线程同时执行更新操作。

如果不写,其结果将不可预料。谨之慎之


二、critical编译指导语句

临界区声明方法

#pragma omp critical [(name)] //[]表示名字可选

{

//并行程序块,同时只能有一个线程能访问该并行程序块

}

critical与atomic的区别在于,atomic仅适用于上一节规定的两种类型操作,而且atomic所防护的仅为一句代码。critical可以对某个并行程序块进行防护。


三 互斥锁函数 保证了一段互斥区只被一个线程操作而不会被其他线程打扰乃至出错。


void opm_init_lock(omp_lock *) 初始化互斥器

void opm_destroy_lock(omp_lock *) 销毁互斥器

void opm_set_lock(omp_lock *) 获得互斥器

void opm_unset_lock(omp_lock *) 释放互斥器

void opm_test_lock(omp_lock *) 试图获得互斥器,如果获得成功返回true,否则返回false


四、nowait

其实for 默认有一个barrier,而加上nowait子句可以消除这个barrier。


五、barrier

利用barrier子句来显式地让程序等待处理完上一个并行区再继续。


六、 master

通过#pragma omp master 来声明对应的并行程序只由主线程完成。


七、section用来指定不同的线程执行不同的部分。


八、ordered 编译指导语句包含在循环内

通过#pragma omp ordered 来将区域内语句串行执行。


九、threadprivate编译指导语句,将一个全局文件作用域变量的属性变为在并行区为每个线程所私有,其格式如下:

#pragma omp threadprivate(list) 换行符


ps:还有 四种线程调度策略:static、dynamic、guided、runtime。 例:#pragma omp parallel for schedule(dynamic, 2)

需要任务线程任务调度时再详叙。

你可能感兴趣的:(Openmp补遗之同步)