Здравствуйте.
У меня мало опыта написания многопоточных приложений, по этому хочу узнать мнение сообщества, является ли такой код потокобезопастным (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%