为了说明同步,我们先来看如下多线程加法的问题,假设x初值为0:
THREAD 1: | THREAD 2: | |
High level code | increment(x) | increment(x) |
Assembly | LOAD A, (x address) | LOAD A, (x address) |
一个可能的执行序列如下:
- Thread 1 loads the value of x into register A.
- Thread 2 loads the value of x into register A.
- Thread 1 adds 1 to register A
- Thread 2 adds 1 to register A
- Thread 1 stores register A at location x
- Thread 2 stores register A at location x
结果将会是1而不是2,为了避免上面的问题,必须进行多线程之间的同步,OpenMP提供了多种同步指令:
MASTER指令
#pragma omp master newline
structured_block
该区域的代码只被主线程执行,其他线程将跳过
CRITICAL 指令
#pragma omp critical [ name ] newline
structured_block
临界资源区,同时只能被一个线程执行,一个线程在执行临界资源区代码时,如果其他线程执行到此处,那么其他线程将会被阻塞,直到此线程离开临界资源区
int main()
{
int x;
x = 0;
#pragma omp parallel shared(x)
{
#pragma omp critical
x = x + 1;
} /* end of parallel section */
return 0;
}
BARRIER 指令
#pragma omp barrier newline
所有到达barrier指令处的线程将会等待,直到所有的线程都到达此处
TASKWAIT 指令
#pragma omp taskwait newline
该指令会等待在当前任务开始时生成的子任务执行完毕
ATOMIC 指令
#pragma omp atomic newline
statement_expression
atomic指令规定一块内存的更新必须是原子的,这意味着多个线程无法同时写它,该指令定义了一个最小临界资源区mini-CRITICAL section
标签:OpemMP,同步,register,newline,omp,线程,指令,pragma,结构 From: https://blog.csdn.net/leizhengshenglzs/article/details/137211207