Как смоделировать серию запросов на чтение / запись в базе данных? - PullRequest
0 голосов
/ 10 апреля 2019

Моя цель для этого задания - моделировать базу данных, которая получает запросы на чтение и запись.Для этого я создаю несколько потоков для представления читателей, а некоторые - для авторов.Есть несколько ограничений, которым я должен следовать, в частности:

1) База данных может обслуживать только один запрос за раз

2) Если база данных простаивает, и ни один запрос не ожидает,немедленно обслуживать любые входящие запросы.

3) Когда поступит запрос, проверьте наличие ожидающих запросов на чтение / запись, а также тип, который был обработан последним.Если нет ожидающего запроса, он попадает на сервер.В противном случае убедитесь, что запросы на чтение / запись чередуются.

Я реализовал переменные, которые, по моему мнению, мне понадобятся, а также структуру, помогающую регистрировать операции базы данных.Мне также была предоставлена ​​функция для проверки того, работает ли она должным образом.

Ниже приведено следующее:

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>

#define MAX 50
#define NUM_READER_THREADS  MAX/2
#define NUM_WRITER_THREADS  MAX/2

#define READER 1
#define WRITER 2
#define EITHER 3

int     reader_in_db=0;        //whether reader is in db
int     writer_in_db=0;        //wehter writer is in db
int     who_is_next=EITHER;    //Who is next : READER, WRITER OR EITHER

int     reader_in_queue=0;    //number of readers in queue
int     writer_in_queue=0;    //number of writers in queue

struct log_t
{
    int id;                //id of the reader or writer
    int type;            //type of operation(READER or WRITER)
}db_log[MAX];            //log of all the db operations

int log_length = 0;        //length of the log

pthread_mutex_t db_mutex;    //mutex
pthread_cond_t db_idle;        //condition variable

//implement the reader
void * reader(void *t) 
{
    int my_id = *(int *)t;

    usleep(10000 + 10000*(my_id*100 % 3));

    printf("leaving db\n");
} 

//implement the writer          
void *writer(void *t) 
{
    int my_id = *(int *)t;

    usleep(10000 + 10000*(my_id*100 % 3));

    printf("leaving db\n");
}

Ниже приведен код для проверки моего окончательного кода.:

int main (int argc, char *argv[])
{
    if(argc != 3)
    {
        printf("Usage: %s n_readers n_writers\n", argv[0]);
        return -1;
    }
    int n_readers = atoi(argv[1]);
    int n_writers = atoi(argv[2]);
    assert(n_readers >= 0 && n_readers <= NUM_READER_THREADS);
    assert(n_writers >= 0 && n_writers <= NUM_WRITER_THREADS);    
    int i;
    int reader_ids[NUM_READER_THREADS];
    int writer_ids[NUM_WRITER_THREADS];
    pthread_t reader_threads[NUM_READER_THREADS];
    pthread_t writer_threads[NUM_WRITER_THREADS];

    pthread_attr_t attr;

    /* Initialize mutex and condition variable objects */
    pthread_mutex_init(&db_mutex, NULL);
    pthread_cond_init (&db_idle, NULL);


    /* For portability, explicitly create threads in a joinable state */
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

    for(i=0;i<n_readers;i++)
    {
        reader_ids[i]=i;    
        pthread_create(&reader_threads[i], &attr, reader, &reader_ids[i]);
    }


    for(i=0;i<n_writers;i++)
    {
        writer_ids[i]=i;    
        pthread_create(&writer_threads[i], &attr, writer, &writer_ids[i]);
    }
    /* Wait for all threads to complete */


    for (i=0; i<n_readers; i++) {
        pthread_join(reader_threads[i], NULL);
    }

    for (int j=0; j<n_writers; j++) {
        pthread_join(writer_threads[j], NULL);
    }


    printf ("main(): done waiting.\n");

    /* Clean up and exit */
    pthread_attr_destroy(&attr);
    pthread_mutex_destroy(&db_mutex);
    pthread_cond_destroy(&db_idle);

    //the following code is for the test case

    int min_n = n_readers > n_writers ? n_writers : n_readers;
    for(i= 1; i<2*min_n; i++)
    {
        if(db_log[i].type + db_log[i-1].type != 3)
        {
            printf("Incorrect result.\n");
            return(-1);
        } 
    }
    printf("Result passed inspection.\n");
    return 0;
} 

Ожидаемые результаты будут следующими:

./reader_writer 2 2
leaving db
leaving db
leaving db
leaving db
main(): done waiting
Result passed inspection.

В настоящее время у меня нет результатов, так как я пытаюсь выяснить функции чтения и записи.

...