OpenMP 线程同步之临界区

摘要:
多核/多线程编程中肯定会用到同步互斥操作。除了互斥变量以为,就是临界区。临界区是指在用一时刻只允许一个线程执行的一段用{...},包围的代码段。在OpenMP中临界区声明方法如下:#pragmaompcritical[]//[]表示名字可选{//需要同一时刻只能有一个线程访问的代码}如下面的代码:1#include2#include34intmain()5{6intsum=0;7#pragmaompparallel8printf("HelloWorld!!!如果将代码中的第13行注释掉,执行结果中的Sum基本就是不确定的。

多核/多线程编程中肯定会用到同步互斥操作。除了互斥变量以为,就是临界区。

临界区是指在用一时刻只允许一个线程执行的一段用{...},包围的代码段。

在OpenMP中临界区声明方法如下:

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

{

//需要同一时刻只能有一个线程访问的代码

}

如下面的代码:

1 #include <stdio.h>
2 #include <omp.h>
3 
4 intmain()
5 {
6     int sum = 0;
7 #pragma omp parallel
8     printf("Hello World!!!
");
9 
10 #pragma omp parallel for    
11     for (int i = 0; i < 10000; ++i)
12 {
13 #pragma omp critical
14 {
15           sum = sum + i%7;
16 }
17 }
18     printf("Sum: %d
",sum);
19     return 0;
20 }

执行结果:

OpenMP 线程同步之临界区第1张

可以看到,机器有8个核,启动了8个线程。如果将代码中的第13行注释掉,执行结果中的Sum基本就是不确定的

免责声明:文章转载自《OpenMP 线程同步之临界区》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Robot Framework自动化测试Selenium2Library库详细用法CSS3 制作一个边框向周围散开的按钮效果下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MySQL-锁

1. 公平锁与非公平锁   公平锁:严格按照线程启动的顺序执行,不允许其他线程插队执行;非公平锁允许插队;   当使用非公平锁时,会立刻尝试配置状态,成功则:插队执行,失败则:与公平锁一样调用acquire()方法,以排他方式获取锁,成功后立刻返回,否则将线程加入队列,直到成功调用为止。 2. 悲观锁与乐观锁   两种常见的资源并发锁设计。   悲观锁:先...

IO与线程状态

这几天在看IO和NIO, 说IO是阻塞的,当多个IO访问服务器时,发生阻塞的时候,CPU要不停的轮询每个IO的线程,看哪个IO的阻塞解除。会浪费CPU资源。 然后我看了线程的状态分类,专门有人说过阻塞和同步是不一样的。 1、新建状态(New):新创建了一个线程对象。 2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法...

C# 单例模式(复习用)

单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该实例的全局访问点。   一、经典模式: public class Singleton { private static Singleton instance; private Singleton()...

记一次调bug的过程:windows下查找java应用程序CPU与内存过高

最近写了一个多线程程序,并发量峰值有五六千,甚至八九千个线程。经过几番调试,程序终于能够正常运行起来了,而实际上“正常运行”的背后却是“暗藏玄机”。在程序运行4、5个小时之后,会发现电脑机箱非常热,风扇转地异常快。打开任务管理器,发现程序的CPU飙到了90%上下,内存占用4G左右。程序看似正常,但检查log文件就会发现有问题,数据丢失地非常多。 我猜测可能...

java 虚拟机(五) jvm参数及调优

JVM 性能监控工具 一、Jinfo 1、用于查看正在运行的Java应用程序的扩展参数 `` jinfo -flags 线程号 `` 2、查看java系统参数 jinfo sysprops 线程号 二、Jstat 用于查看堆栈信息 jstat -class 线程号 其中 Loaded:加载class的数量 Bytes:所占用空间大小 Unloa...

Tair rdb(redis存储引擎)实现介绍

淘宝那岩曾经在淘宝核心系统团队博客上介绍过Tair ldb的实现,本文将尝试着介绍rdb(redis存储引擎)的实现。 Tair是淘宝开源的分布式KV缓存系统,内部将功能模块化,抽离出底层存储细节,可以接入不同的存储引擎。redis是一个开源的、高效的key-value存储,提供了strings、hashs、lists、sets、sorted sets等多...