На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: 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:
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0349 ]   [ 17 queries used ]   [ Generated: 19.03.24, 09:15 GMT ]