Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.222.69.152] |
|
Сообщ.
#1
,
|
|
|
Доброе время суток.
Не откажите в помощи. Подскажите, пожалуйста, что я сделал не так, кодируя пример: std::mutex mut; std::condition_variable data_cond; std::queue<DataForExchange> exch_data; extern FILE* fp; CThread_synchro::CThread_synchro(void): endWork(false) { fopen_s(&log,"logFile","w"); } CThread_synchro::~CThread_synchro(void) { if (log) fclose(log); } void CThread_synchro::_prepereData() { TCHAR* tcTok = 0; TCHAR del[] = " \t\r\n"; TCHAR buff[1024] = ""; DataForExchange tmp; short c = 0; auto now = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now()); while (_fgetts(buff,1024,fp) != NULL) { c = 0; std::lock_guard<std::mutex> lg(mut); tmp.t = _ttof(_tcstok(buff,del)); while (tcTok = _tcstok(0,del)) { if (c == 0) tmp.x = _ttof(tcTok); if (c == 1) tmp.y = _ttof(tcTok); if (c == 2) tmp.z = _ttof(tcTok); if (c == 3) tmp.xv = _ttof(tcTok); if (c == 4) tmp.yv = _ttof(tcTok); if (c == 5) tmp.zv = _ttof(tcTok); ++c; } exch_data.push(tmp); data_cond.notify_one(); } endWork = true; long long comm = (std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now()) - now).count(); //... } void CThread_synchro::_proccesData() { FILE* fpout; fopen_s(&fpout,"out","w"); DataForExchange tmp; while (true) { if (endWork) break; std::unique_lock<std::mutex> lg(mut); data_cond.wait(lg,[]{return !exch_data.empty();}); tmp = exch_data.front(); exch_data.pop(); if (fpout) { fprintf_s(fpout,"%.3e\t",tmp.t); fprintf_s(fpout,"%.16E\t%.16E%.16E\t",tmp.x,tmp.y,tmp.z); fprintf_s(fpout,"%.16E\t%.16E%.16E\t",tmp.xv,tmp.yv,tmp.zv); } lg.unlock(); } fclose(fpout); } main: int _tmain(int argc, _TCHAR* argv[]) { CThread_synchro exampl; //... std::thread t2(&CThread_synchro::_prepereData,&exampl); t2.detach(); std::thread t1(&CThread_synchro::_proccesData,&exampl); t1.detach(); //... return 0; } Когда пытаюсь запустить - программа вылетает по исключению: "mutex destroyed while busy". Прохожу в отладчике... там не понятно... Поток _prepereData наполняет очередь (до 20), а затем идет синхронная работа двух потоков.... Это приложение учеба. Взял из книги. В реальности будут поток, который рассчитывает данные, и поток, который их отображет |
Сообщ.
#2
,
|
|
|
Цитата agapa @ Когда пытаюсь запустить - программа вылетает по исключению: "mutex destroyed while busy". У тебя глобальный мьютех удаляется до того, как завершаются потоки. Убери detach() и сделай std::thread t2(&CThread_synchro::_prepereData,&exampl); std::thread t1(&CThread_synchro::_proccesData,&exampl); .... t1.join(); t2.join(); |
Сообщ.
#3
,
|
|
|
Доброе время суток!
Да, действительно Благодарю |