Добавил:
Факультет ИКСС, группа ИКВТ-61 Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

LAB / WORK_6 / main

.cpp
Скачиваний:
39
Добавлен:
20.02.2019
Размер:
2.81 Кб
Скачать
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <cmath>
#include <semaphore.h>
#include <unistd.h>
using namespace std;

typedef struct
{
        uintptr_t *a;
        uintptr_t length;
        uintptr_t sum;
} MyData;

#define N 5
#define L 20

static MyData mData;
static pthread_t myThread[N];
static sem_t sem1, sem2;
static uintptr_t *a = reinterpret_cast<uintptr_t*>( malloc (N*L*sizeof(uintptr_t)) );


void *threadWork(void *arg)
{
    uintptr_t offset = reinterpret_cast<uintptr_t>(arg);
    uintptr_t sum = 0;
    uintptr_t start = offset * mData.length;
    uintptr_t end = start + mData.length;
//Критическая секция №3
    sem_wait(&sem1);
    printf("\nThread \"%llu\" at work\n", offset + 1);
    for (uintptr_t i = 0; i < L/N; i++)
    {
        for (uintptr_t j = start + N*i; j < start + N*i + N; j++)
        {
            printf(" [%3llu] ", mData.a[j]);
        }
        puts("");
    }
    for (uintptr_t i = start; i < end ; i++)
        sum += mData.a[i];
    printf ("\tSum = %llu \n", sum);
    mData.sum += sum;
    sem_post(&sem1);
//Конец критической секции №3

    pthread_exit(nullptr);
}

void *createArray(void *arg)
{
    uintptr_t offset = reinterpret_cast<uintptr_t>(arg);
    uintptr_t start = offset * mData.length;
    uintptr_t end = start + mData.length;

//Критическая секция №1
    sem_wait(&sem2);
    for (uintptr_t i = start; i < end ; i++)
        a[i] = pow((i+1), 1);
    int value;
    sem_getvalue(&sem2, &value);

    while(value != 0)
    {
        sem_getvalue(&sem2, &value);
    }
    sleep(1);
//Конец критической секции №1

//Критическая секция №2
    sem_wait(&sem1);
    sem_getvalue(&sem2, &value);
    if ( value == 0 )
    {
        sem_post(&sem2);
        puts("The array data present:");
        puts("");
        for (uintptr_t i = 0; i < L ; i++)
        {
            for (uintptr_t j = i*N; j < i*N + N; j++)
            {
                printf(" [%3llu] ", mData.a[j]);
            }
            puts("");
        }
    }
    sem_post(&sem1);
//Конец критической секции №2

    threadWork(arg);
}

int main ()
{
    mData.length = L;
    mData.a = a;
    mData.sum = 0;

    void *status;
    sem_init(&sem1, 0, 1);
    sem_init(&sem2, 0, N);

    for(long i=0; i < N; i++)
            pthread_create(&myThread[i], nullptr, createArray,  reinterpret_cast<void*>(i));

    for(int i=0; i < N; i++)
        pthread_join(myThread[i], &status);

    printf ("\n\tSum = %llu \n", mData.sum);
    free (a);

    sem_destroy(&sem1);
    sem_destroy(&sem2);

    return 0;
}
Соседние файлы в папке WORK_6