ostringstream к вектору<String> для многопоточной очереди

Итак, у меня есть приложение, которое является сервером, который открывает несколько потоков, которые будут использоваться для запросов к базе данных. В моей функции получения я протестировал вывод для моего запроса, который я построил, и он выглядит нормально, когда я создаю поток ostringstream, поэтому я добавляю его в вектор. Я тогда cout вектор, и это также выглядит хорошо. Все это делается внутри блокировки мьютекса, поэтому я разблокирую мьютекс. Потоки моей базы данных находятся в цикле while, который проверяет, является ли мой vector.size() > 0.

У меня проблема в том, что мой цикл никогда не запускается, потому что он никогда не видит вектор> 0(что и должно быть, потому что я смог обработать vector.begin(), и он работал нормально. Может ли кто-нибудь взглянуть на код У меня есть и скажите мне, если есть какие-либо проблемы, которые могут быть причиной этой проблемы.

#Header
class CNetworkService : public Service
{
   public:
CNetworkService(void);
~CNetworkService(void);
std::ostringstream query;
string  record;
std::vector<string> queue;
string IP;
unsigned int Port;
void DBWork();
bool SaveLog(string insert);
   protected:
virtual void handle(LogicalConnection* pClient, IncomingPacket* pRequest);
};

#Source File
//In my receive handler
    mtx.lock();
query << var1 << var2;

queue.push_back(query.str());
mtx.unlock();
query.clear();



//This is the function that the database threads are looping in
void CNetworkService::DBWork()
{


while(true)
{
mtx.lock();
while(queue.size() > 0)
{
    printf("Adding new record \n");
    SaveLog(queue.front());
    queue.erase(queue.begin());

}
mtx.unlock();
    }
    }

  //The code in the main thread which launches each thread. StartDBThread does some reporting stuff and then lauches the DBWork function, and I can see that DBWork is getting called. In the original attempt I was trying to launch 4 threads, but for now I have scaled it back to 1 thread in order to test and get a working solution.
  std::thread threads[1];
  // spawn 1 threads:
  for (int i=0; i<1; ++i)
  threads[i] = std::thread(StartDBThread, i+1);

  for (auto& th : threads) th.join();

1 ответ

Одна из возможных проблем, о которых я мог подумать, заключается в том, что мьютекс получается где-то еще в вашем коде и CNetworkService::DBWork() не получил замок.

Это не может быть причиной проблемы. Но вы можете предотвратить это, имея mtx переменная частное поле CNetworkService поскольку он используется для синхронизации очереди, и вы не хотите, чтобы она использовалась где-либо еще.

Я предлагаю вам проверить, напечатав что-то между mtx.lock() а также while(queue.size() > 0) чтобы увидеть, если замок когда-либо приобретается.

PS vector::erase это очень дорого.

Другие вопросы по тегам