2 буферных буфера для совместного использования с вызовами pthread, блокировками мьютекса и занятым ожиданием - PullRequest
0 голосов
/ 19 октября 2019

Я, как правило, новичок в C, поэтому у меня множество синтаксических ошибок и проблем со ссылками. Я написал prodcons.c, Struct, который создаст ограниченный буфер размером 50 и несколько вспомогательных переменных. В основном я создаю переменную этой структуры данных и инициализирую ее. Я пытаюсь принять любое количество аргументов (IE {1..1000}), скажем, в тысячи и PUSH их в буфер, в то время как другой C-файл provider.c пытается POP из того же буфера, которыйЯ поделился этим с потоком вызовов. PUSH и POP оба имеют блокировку мьютекса, чтобы остановить любые изменения в критической секции одновременно. Затем поток источника инициализирует другую структуру данных, извлекает основные факторы каждого аргумента из main в их общем буфере, разделяет новую инициализированную структуру данных с вызовом функции Consumer.c в потоке. Потребитель просто печатает число и его основные факторы. Я считаю, что мне нужно иметь #include prodcons.h во всех моих файлах, чтобы использовать его функции, но, пожалуйста, исправьте меня, если я ошибаюсь. Кроме того, я пытаюсь создать BUSY WAITNG, где основной и продюсер каждый раз пытаются попасть в критическую секцию с циклами while, вызывая POP и PUSH, но это, скорее всего, неправильно. ПОЖАЛУЙСТА, ПОМОГИТЕ, СОВЕТУЙТЕ, СИНТАКС. НИЧЕГО.

Честно говоря, я пытался просто скомпилировать код, но мои ссылки и указатели и любой правильный способ в C для обмена файлами и обращения к указателям на структуру данных отключены. Я думаю, что мне просто нужно много исправлений. Например, при использовании указателя структуры я использую pc-> function () или pc.function ()? Эти небольшие синтаксические ошибки застряли у меня. Я делюсь всем по consumer.h и consumer.c, потому что выясняю проблемы в main и производителе, а затем в потребителе, который я могу выяснить.

'''prodcons.h
#include <pthread.h>
#define BUFFER_SIZE (50)

struct prodcons {
        int buffer[BUFFER_SIZE];
        int count;
        int top;
        int next;
        pthread_mutex_t count_lock;
};

void pc_init(struct prodcons *pc);
int pc_pop(struct prodcons *pc);
void pc_push(struct prodcons *pc, int val);
'''

'''prodcons.c

void pc_init(struct prodcons *pc)
{ 
        count = 0;
        top = 0;
        next = 0;
}

int pc_pop(struct prodcons *pc)
{
        int val;
        pthread_mutex_lock(&pc.count_lock);

        if (counter > top)
        {
                val = pc.buffer[count];
                pc.buffer[count] = 0;
                pc.count--;
        }

        pthread_mutex_unlock(&pc.count_lock);
        return val;
}

void pc_push(struct prodcons *pc, int val)
{
        pthread_mutex_lock(&pc.count_lock);

        if (count < BUFFER_SIZE)
        {
                pc.buffer[count] = val;
                pc.count++;
        }

        pthread_mutex_unlock(&pc.count_lock);
}



'''main.c file

#include <pthread.h>
#include <stdlib.h>
#include <math.h>
#include "producer.h"
#include "prodcons.h"

int main(int argc, char *argv[])

{
        int index = 1;
        int num;
        struct prodcons pc_nums;



        //pthread_t tid[argc - 1];
        pthread_t tid;
        pthread_attr_t attr;

        if (argc <  2) {
                fprintf(stderr, "usage: No arguments\n");
                return -1;
        }
        if (atoi(argv[1]) <= 0)
        {
                fprintf(stderr, "%d not > 0 or you must provide a positive integer.\n", atoi(argv[1]));
                return -1;
        }

        /*get the default attributes */
        pthread_attr_init(&attr);

        //init the data structure
        pc_init(&pc_nums);


        //create producer thread
        pthread_create(&tid, &attr, *producer, &pc_nums);

        while (index < argc)
        {
                num = atoi(argv[index]);
                pc_push(&pc_nums, num);
                index++;
        }
}

'''producer.h
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <math.h>
#include "consumer.h"


void factor2pc(struct prodcons *pc, int number);
void *producer(void *data);

'''producer.c
#include <math.h>
#include <pthread.h>

void factor2pc(struct prodcons *pc, int number) {

        pthread_t tid;
        pthread_attr_t attr;
        //int counter = 0;

        //Add original value to int* primeNumbers for return printing
        pc->pc_push(&pc, number);

        //Print twos that divide argument
        while (number % 2 == 0)
        {
                pc->pc_push(&pc, 2);
                number = number/2;
        }

        //Argument is odd. Check using i + 2
        for (int i = 3; i <= sqrt(number); i = i + 2)
        {
                while (number % i == 0)
                {
                        pc->pc_push(&pc, i);
                        number = number/i;
                }
        }

        //When n is a prime number greater than 2
        if (number > 2)
        {
                pc->pc_push(&pc, number);
        }

        //add -1 to end of number prime factors to sign
        pc->pc_push(&pc, number);
}

void *producer(void *data) {

        int number;
        struct prodcons primeNums;
        pc_init(&primeNums);

        //call consumer thread
        pthread_t tid;
        pthread_attr_t attr;
        pthread_create(&tid, attr, *consumer, &primeNums);

        while (data.count < BUFFER_SIZE)
        {
                number = data.pc_pop(data);
                factor2pc(&primeNums, number);
        }
}

Я ожидаю вывод каждого числа и его простых чисел.

...