Является ли класс потокобезопастным?
От: wint  
Дата: 19.02.10 11:44
Оценка:
Здравствуйте.

У меня мало опыта написания многопоточных приложений, по этому хочу узнать мнение сообщества, является ли такой код потокобезопастным (thread safe):

Этот класс будет общим для всех потоков:
typdef boost::shared_ptr<Report> REPORT_PTR
typedef std::queue<REPORT_PTR>  REPORT_PTR_QUEUE
class ReportCollector
{
private:
    REPORT_PTR_QUEUE qReports;
    boost::mutex mLock;

public:
    ReportCollector() {};
    ~ReportCollector() {};
    void AddReport(REPORT_PTR& _report);
    void Show();
};

void ReportCollector::AddReport(REPORT_PTR &_report)
{
    boost::mutex::scoped_lock lock(mLock);
    
        qReports.push(_report);
}

void ReportCollector::Show()
{
    boost::mutex::scoped_lock lock(mLock);
    
    while (!qReports.empty())
    {
        REPORT_PTR r = qReports.front();
    std::wcout << L"Task result: " << r->result << std::endl;
        Reports.pop();
    }
}


Процедура обратного вызова для таймеров создающих отчеты:
void CALLBACK TimerRoutine(PVOID lpParam, BOOLEAN TimerOrWaitFired)
{
    TimerRoutineArg* pArg = (TimerRoutineArg*)lpParam;
    
    std::vector<BYTE> vSenseInfo(1024);
    WORD wLength = 0;

    int result = OK_CODE;

    if (!pArg->vDllFuncArg.empty())
    {
        result= pArg->pSomeFunctionInDll(&(pArg->vDllFuncArg[0]), pArg->vDllFuncArg.size(), &vSenseInfo[0], wLength);
    }

    REPORT_PTR r(new Report());
    r->result = result;
    gReports.AddReport(r);
}


Процедура обратного вызова для таймера забирающего отчеты:
void CALLBACK ShowReportRoutine(PVOID lpParam, BOOLEAN TimerOrWaitFired)
{
    gReports.Show();
}


Функция Main:
// Глобальный объект (выше объявлен как extern ReportCollector gReports)
ReportCollector gReports;

void main()
{
    /* Создаем очередь таймеров и несколько таймеров с заданиями (TimerRoutine) */
    /* Создаем таймер с процедурой ShowReportRoutine */ 
   
    system("pause"); // Ждем пока не надоест.    
}
loading.............. 87%
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.