OpenMP 互斥锁函数

OpenMP API所提供的互斥函数可放在任意需要的位置。程序员必须自己保证在调用相应锁操作之后释放相应的锁,否则就可能造成多线程程序的死锁。
下面为OpenMP API函数提供的互斥函数和可嵌套的互斥锁函数。

void omp_init_lock(omp_lock*):初始化互斥器
void omp_destroy_lock(omp_lock*):销毁互斥器
void omp_set_lock(omp_lock*):获得互斥器
void omp_unset_lock(omp_lock*):释放互斥器
void omp_test_lock(omp_lock*): 试图获得互斥器,如果获得成功则返回true,否则返回false

#include 
#include 
static omp_lock_t lock;
int main()
{
    int i;
    omp_init_lock(&lock);

#pragma omp parallel for
    for (i = 0; i < 5; ++i)
    {
        omp_set_lock(&lock);
        printf("%d +\n", omp_get_thread_num());
        printf("%d -\n", omp_get_thread_num());
        omp_unset_lock(&lock);
    }

    omp_destroy_lock(&lock);

    return 0;
}

上例对for循环中的所有内容进行加锁保护,同时只能有一个线程执行for循环中的内容。
线程1或线程2在执行for循环内部代码时不会被打断。如果删除代码中的获得锁释放锁的代码,则相当于没有互斥锁。

输出:

0 +
0 -
3 +
3 -
1 +
1 -
4 +
4 -
2 +
2 -

你可能感兴趣的:(高性能计算,openmp)