Печать с помощью библиотеки Boost Threading - PullRequest
1 голос
/ 03 февраля 2012

Итак, я начинаю писать программу для анализа и обработки большого количества текста. Я создал класс, который содержит методы, которые запускаются как потоки повышения. На данный момент каждый из этих потоков просто печатает текстовое утверждение и затем возвращает. Код компилируется и запускается без ошибок. Тем не менее, текст распечатан непоследовательно. Этого следует ожидать, поскольку потоки работают параллельно, поэтому я попытался использовать мьютекс для координации использования вывода. Тем не менее, я явно делаю что-то не так, так как результаты все еще противоречивы. Чтобы добавить к этому, некоторые выходные данные печатаются дважды, что я не могу объяснить как неправильное кодирование мьютекса. Ниже мой код:

/* 
 * 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);

1 Ответ

2 голосов
/ 03 февраля 2012
boost::mutex::scoped_lock(coutMut);

Это не делает то, что вы думаете, что делает.Это создает временный объект, который немедленно уничтожается, освобождая замок.Точно так же, как int(3);.

Вы хотите:

boost::mutex::scoped_lock sl(moutMut);

Это создает объект sl, который удерживает блокировку, пока она не выйдет из области видимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...