На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: JoeUser, Qraizer, Hsilgos
  
> Проблемы синхронизации 2-х потоков
Доброе время суток.
Не откажите в помощи. Подскажите, пожалуйста, что я сделал не так, кодируя пример:
ExpandedWrap disabled
    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:
ExpandedWrap disabled
    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".
Прохожу в отладчике... там не понятно... :unsure: Поток _prepereData наполняет очередь (до 20), а затем идет синхронная работа двух потоков....
Это приложение учеба. Взял из книги. В реальности будут поток, который рассчитывает данные, и поток, который их отображет
Цитата agapa @
Когда пытаюсь запустить - программа вылетает по исключению: "mutex destroyed while busy".

У тебя глобальный мьютех удаляется до того, как завершаются потоки. Убери detach() и сделай
ExpandedWrap disabled
        std::thread t2(&CThread_synchro::_prepereData,&exampl);
        std::thread t1(&CThread_synchro::_proccesData,&exampl);
        ....
        t1.join();
        t2.join();
Сообщение отредактировано: Олег М -
Доброе время суток!
Да, действительно :blush:
Благодарю :thanks:
1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
0 пользователей:


Рейтинг@Mail.ru
[ Script Execution time: 0,0814 ]   [ 20 queries used ]   [ Generated: 23.05.18, 22:30 GMT ]