Я пытаюсь реализовать задачу читателя-писателя при чтении / записи файла, а не просто переменной в C ++. Для этой цели я объявил глобальную переменную fstream
, которая открывает файл. и две функции, одна для читателя, другая для писателя. Вот мой код:
#include<pthread.h>
#include<semaphore.h>
#include<iostream>
#include<fstream>
using namespace std;
/// One writer, multiple readers
// initialize the file to be read and write
fstream file("text.txt",ios::in|ios::out|ios::app);
// declare semaphore and mutex
sem_t rw_semaphore;
pthread_mutex_t multiread_mutex;
// variable to keep track of number of readers
int readers = 0;
void *writer(void *arg){
// try to get the semaphore for accessing the file
sem_wait(&rw_semaphore);
// write to the file
file << "Wrote to the file.."<<*(int *)arg<<endl;
cout<<"Writer no. "<<*(int *)arg<<" wrote to the file"<<endl;
// signal realease of semaphore for accessing the file
sem_post(&rw_semaphore);
}
void *reader(void *arg){
// Lock mutex for accessing readers count variable
pthread_mutex_lock(&multiread_mutex);
readers++;
// if this is the first reader, try to get the semaphore
if(readers == 1){
sem_wait(&rw_semaphore);
}
// release mutex lock
pthread_mutex_unlock(&multiread_mutex);
// read the file
cout<<"Reader no: "<<*(int *)arg<<" reading file: -"<<endl;
for(string line;getline(file,line);){
cout<<line<<endl;
}
file.clear();
// lock mutex
pthread_mutex_lock(&multiread_mutex);
readers--;
// if this is the last reader, release the semaphore
if(readers == 0){
sem_post(&rw_semaphore);
}
// release mutex lock
pthread_mutex_unlock(&multiread_mutex);
}
int main()
{
pthread_t read[7], write[5];
pthread_mutex_init(&multiread_mutex,NULL);
sem_init(&rw_semaphore,0,1);
int *arg = new int;
for(int i=0;i<7;i++){
*arg = i+1;
pthread_create(&read[i],NULL,reader,(void *)arg);
}
for(int i=0;i<5;i++){
*arg = i+1;
pthread_create(&write[i],NULL,writer,(void *)arg);
}
for(int i=0;i<7;i++){
pthread_join(read[i],NULL);
}
for(int i=0;i<5;i++){
pthread_join(write[i],NULL);
}
pthread_mutex_destroy(&multiread_mutex);
sem_destroy(&rw_semaphore);
file.close();
return 0;
}
Но cout
, печатающий строки в файле, ничего не печатает. Вот результат, который я получаю:
Reader no: 2 reading file: -
Reader no: 3 reading file: -
Reader no: 4 reading file: -
Reader no: 5 reading file: -
Reader no: 6 reading file: -
Reader no: 7 reading file: -
Reader no: 1 reading file: -
Writer no. 2 wrote to the file
Writer no. 3 wrote to the file
Writer no. 3 wrote to the file
Писатель отлично записывает файл, и файл не пуст во время чтения. Что я делаю не так?