B. stub per le funzioni della libreria di runtime

In questa sezione vengono forniti gli stub per le funzioni della libreria di runtime definite in OpenMP C# e C++ API.Gli stub sono forniti per abilitare la portabilità alle piattaforme che non supportano il OpenMP C# e C++ API.Su queste piattaforme, i programmi di OpenMP deve essere collegato a una libreria contenente queste funzioni dello stub.Le funzioni dello stub si presuppone che le direttive nel programma di OpenMP sono ignorate.Di conseguenza, emulano la semantica seriale.

[!NOTA]

La variabile di blocco che viene visualizzato nelle funzioni di blocco deve essere accessibile esclusivamente con queste funzioni.Non deve essere inizializzata o essere modificata in caso contrario nel programma applicativo.Gli utenti non devono formulare ipotesi sui meccanismi utilizzati dalle implementazioni di OpenMP C e C++ e ai blocchi di utilizzo in base alla combinazione utilizzate da funzioni dello stub.

wht5z9b3.collapse_all(it-it,VS.110).gifCodice

#include <stdio.h>
#include <stdlib.h>
#include "omp.h"
#ifdef __cplusplus
extern "C" {
#endif


void omp_set_num_threads(int num_threads)
{
}
int omp_get_num_threads(void)
{
    return 1;
}
int omp_get_max_threads(void)
{
    return 1;
}
int omp_get_thread_num(void)
{
    return 0;
}
int omp_get_num_procs(void)
{
    return 1;
}
void omp_set_dynamic(int dynamic_threads)
{
}
int omp_get_dynamic(void)
{
    return 0;
}
int omp_in_parallel(void)
{
    return 0;
}
void omp_set_nested(int nested)
{
}
int omp_get_nested(void)
{
    return 0;
}
enum {UNLOCKED = -1, INIT, LOCKED};
void omp_init_lock(omp_lock_t *lock)
{
    *lock = UNLOCKED;
}
void omp_destroy_lock(omp_lock_t *lock)
{
    *lock = INIT;
}
void omp_set_lock(omp_lock_t *lock)
{
    if (*lock == UNLOCKED) 
    {
        *lock = LOCKED;
    } 
    else 
        if (*lock == LOCKED) 
        {
         fprintf_s(stderr, "error: deadlock in using lock variable\n");
         exit(1);
        } else {
         fprintf_s(stderr, "error: lock not initialized\n");
         exit(1);
        }
}


void omp_unset_lock(omp_lock_t *lock)
{
    if (*lock == LOCKED) 
    {
        *lock = UNLOCKED;
    } 
    else 
        if (*lock == UNLOCKED) 
        {
            fprintf_s(stderr, "error: lock not set\n");
            exit(1);
        } else {
            fprintf_s(stderr, "error: lock not initialized\n");
            exit(1);
        }
}

int omp_test_lock(omp_lock_t *lock)
{
    if (*lock == UNLOCKED) 
    {
        *lock = LOCKED;
        return 1;
    } else if (*lock == LOCKED) {
        return 0;
    } else {
        fprintf_s(stderr, "error: lock not initialized\n");
        exit(1);
    }
}

#ifndef OMP_NEST_LOCK_T
typedef struct {  // This really belongs in omp.h 
    int owner;
    int count;
} omp_nest_lock_t;
#endif
enum {MASTER = 0};
void omp_init_nest_lock(omp_nest_lock_t *lock)
{
    lock->owner = UNLOCKED;
    lock->count = 0;
}
void omp_destroy_nest_lock(omp_nest_lock_t *lock)
{
    lock->owner = UNLOCKED;
    lock->count = UNLOCKED;
}


void omp_set_nest_lock(omp_nest_lock_t *lock)
{
    if (lock->owner == MASTER && lock->count >= 1) 
    {
        lock->count++;
    } else 
        if (lock->owner == UNLOCKED && lock->count == 0) 
        {
            lock->owner = MASTER;
            lock->count = 1;
        } else 
        {
       fprintf_s(stderr, "error: lock corrupted or not initialized\n");
         exit(1);
    }
}

void omp_unset_nest_lock(omp_nest_lock_t *lock)
{
    if (lock->owner == MASTER && lock->count >= 1) 
    {
        lock->count--;
        if (lock->count == 0) 
        {
            lock->owner = UNLOCKED;
        }
    } else 
        if (lock->owner == UNLOCKED && lock->count == 0) 
        {
            fprintf_s(stderr, "error: lock not set\n");
            exit(1);
        } else 
        {
       fprintf_s(stderr, "error: lock corrupted or not initialized\n");
       exit(1);
    }
}


int omp_test_nest_lock(omp_nest_lock_t *lock)
{
    omp_set_nest_lock(lock);
    return lock->count;
}


double omp_get_wtime(void)
{
    // This function does not provide a working
    // wallclock timer. Replace it with a version
    // customized for the target machine.
    return 0.0;
}

double omp_get_wtick(void)
{
    // This function does not provide a working
    // clock tick function. Replace it with
    // a version customized for the target machine.
    return 365. * 86400.;
}

#ifdef __cplusplus
}
#endif