Итак, я начинаю писать программу для анализа и обработки большого количества текста. Я создал класс, который содержит методы, которые запускаются как потоки повышения. На данный момент каждый из этих потоков просто печатает текстовое утверждение и затем возвращает. Код компилируется и запускается без ошибок. Тем не менее, текст распечатан непоследовательно. Этого следует ожидать, поскольку потоки работают параллельно, поэтому я попытался использовать мьютекс для координации использования вывода. Тем не менее, я явно делаю что-то не так, так как результаты все еще противоречивы. Чтобы добавить к этому, некоторые выходные данные печатаются дважды, что я не могу объяснить как неправильное кодирование мьютекса. Ниже мой код:
/*
* File: ThreadParser.h
* Author: Aaron Springut
*
* Created on Feburary 2, 2012, 5:13 PM
*/
#ifndef THREADPARSER_H
#define THREADPARSER_H
#include <string.h>
#include <iostream>
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/bind.hpp>
#include "FileWordCounter.h"
class ThreadParser {
public:
ThreadParser();
ThreadParser(std::string fileName);
private:
//mutex for cout
boost::mutex coutMut;
std::string dataFile;
FileWordCounter fCounter;
//threads
void parseFile();
void processSearches();
};
#endif
/*
* File: ThreadParser.cpp
* Author: Aaron Springut
*
* Created on Feburary 2, 2012, 5:13 PM
*/
#include "ThreadParser.h"
using namespace std;
ThreadParser::ThreadParser(){
double buyNum = 0;
buyNum = buyNum * 100;
cout << "Percentage of people buying: "<< buyNum <<"%"<<endl;
}
ThreadParser::ThreadParser(string fileName){
dataFile = fileName;
double buyNum = 0;
//create the mutex and aquire a lock on it for this thread
boost::mutex::scoped_lock(coutMut);
boost::thread parseThread(boost::bind(&ThreadParser::parseFile, this));
boost::thread processSearches(boost::bind(&ThreadParser::processSearches,this));
buyNum = buyNum * 100;
cout << "Percentage of people buying: "<< buyNum <<"%"<<endl;
}
void ThreadParser::parseFile(){
boost::mutex::scoped_lock(coutMut);
cout << "parseFileThreadLaunch"<<endl;
return;
}
void ThreadParser::processSearches(){
boost::mutex::scoped_lock(coutMut);
cout << "processSearchesLaunch"<<endl;
return;
}
В качестве примера того, что идет не так, приведем два вывода из программы, которая выполняет это:
Percentage of people buying: parseFileThreadLaunch
processSearchesLaunch
0%
Хорошо, cout не безопасен для потоков, и я сделал что-то не так с мьютексом.
Percentage of people buying: parseFileThreadLaunch
0%
processSearchesLaunch
processSearchesLaunch
Это сбивает с толку, как последняя строка печатается дважды? Это следствие того, что cout не является поточно-ориентированным? Или я упускаю часть общей картины.
EDIT:
Класс вызывается примерно так в основной функции:
string fileName("AOLData.txt");
cout << fileName<< endl;
ThreadParser tp(fileName);