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