Опыта в написании программ на с++ у меня немного, а в разработке многопоточных приложений - вообще нет. Подскажите как синхронизировать экземпляр класса в моем случае?
Пытаюсь использовать мьютексы, но что-то делаю не так, есили смотреть под дебаггером, в разных потоках у меня получаются разные объекты. Мне нужно использовать значения полей одного и того же объекта в двух потоках.
Суть задачи: делаю парсер файла логов, первый поток отделяет основные события друг от друга, второй парсит эти события более подробно.
main.cpp
mutex m;
void ReadLog(Parser input, mutex &m) {
if (input.filename != "")
input.ReadLog(m);
}
void ParceEvents(Parser input, mutex &m) {
if (input.filename != "")
input.ParseEvent( m);
}
int main(int argc, char* argv[])
{
setlocale(LC_ALL, "rus");
filename = "default_trace.log";
Parser item = Parser(filename);
thread thread_1(ReadLog, ref(item), ref(m));
thread thread_2(ParceEvents, ref(item), ref(m));
thread_1.join();
thread_2.join();
system("pause");
return 0;
}
Parser.cpp
using namespace std;
Parser::Parser(string input)
{
this->filename = input;
this->cursor = 0;
this->events_parsed = 0;
this->isReading = false;
}
void Parser::ParseEvent(mutex &m) {
this->events_parsed = 0;
this->isReading = true;
this_thread::sleep_for(chrono::milliseconds(100));
while (true) {
cout << "ololo\r\n";
if (this->events_parsed >= this->cursor) {
this_thread::sleep_for(chrono::milliseconds(100));
m.lock();
this->events_parsed = this->cursor;
m.unlock();
}
else {
for (int i = this->cursor - this->events_parsed;
i <= this->cursor; this->events_parsed++) {
//парсим событие далее
}
}
if (!this->isReading)
break;
}
}
//Читает лог-файл
void Parser::ReadLog(mutex &m) {
regex regex_timestamp(R_DATE);
vector<string> lines_of_event;
bool read_event = false;
Event ev;
ifstream file(this->filename);
this->isReading = true;
int i = 0;
for (string line; getline(file, line); i++) {
smatch match;
if (regex_search(line, match, regex_timestamp)) {
ev.Lines = lines_of_event;
this->Events.push_back(ev);
list<string> words = GetListWords(line);
vector<string> str_array = GetStringVectorFromList(words);
ev = Event(str_array);
lines_of_event.clear();
}
else {
bool line_is_slash_t = (line[0] == '\t' && line.size() == 1);
bool line_is_empty = (line == "" && line.size() == 0);
if (!(line_is_slash_t xor line_is_empty)) {
/*
regex regex_statement(R_STATEMENT_N);
if(regex_search(line, match, regex_statement)) {
//cout << line;
}
*/
lines_of_event.push_back(line);
}
}
m.lock();
this->cursor = i;
m.unlock();
}
cout << "Reading is done...\r\n";
file.close();
this->isReading = false;
}