Моя цель для этого задания - моделировать базу данных, которая получает запросы на чтение и запись.Для этого я создаю несколько потоков для представления читателей, а некоторые - для авторов.Есть несколько ограничений, которым я должен следовать, в частности:
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.
В настоящее время у меня нет результатов, так как я пытаюсь выяснить функции чтения и записи.