@hidden_pingvin

Как использовать один объект в разных потоках?

Опыта в написании программ на с++ у меня немного, а в разработке многопоточных приложений - вообще нет. Подскажите как синхронизировать экземпляр класса в моем случае?
Пытаюсь использовать мьютексы, но что-то делаю не так, есили смотреть под дебаггером, в разных потоках у меня получаются разные объекты. Мне нужно использовать значения полей одного и того же объекта в двух потоках.

Суть задачи: делаю парсер файла логов, первый поток отделяет основные события друг от друга, второй парсит эти события более подробно.
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;
}
  • Вопрос задан
  • 211 просмотров
Решения вопроса 1
myjcom
@myjcom Куратор тега C++
void ReadLog(Parser& input, mutex &m) {
  if (input.filename != "")
    input.ReadLog(m);
}

void ParceEvents(Parser& input, mutex &m) {
  if (input.filename != "")
    input.ParseEvent( m);	
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы