Я изучаю параллельное программирование, и я хочу создать класс, в котором каждый объект отвечает за запуск собственного Boost:Thread. Я немного запутался с этим кодом, потому что он использует МНОГО функций, которые мне не очень удобны (динамически выделяемая память, указатели функций, параллелизм и т. д. и т. д.). Как и в каждой строке кода, мне приходилось проверять некоторые ссылки, чтобы сделать это правильно.
(Да, в реальном коде учитывается вся выделенная память!)
У меня проблемы с мьютексами. Я объявляю его статическим, и кажется, что он получает одинаковое значение для всех экземпляров (как и должно быть). Код ВСЕ ЕЩЕ не потокобезопасен.
Мьютекс должен остановить потоки (правильно?) от дальнейшего продвижения в случае, если кто-то другой заблокировал его. Поскольку мьютексы ограничены (своего рода изящная функциональность), и это внутри оператора if, который должен искать другие потоки, нет? Тем не менее я получаю консольные выходы, которые явно предполагают, что это не потокобезопасно.
Также я не уверен, что использую static vaiable right. Я пробовал разные способы ссылаться на него (Seller::ticketSaleMutex), но единственное, что сработало, это «this->ticketSaleMutex», что кажется очень сомнительным и, кажется, противоречит цели его статичности.
Продавец.ч:
class Seller
{
public:
//Some vaiables
private:
//Other variables
static boost::mutex ticketSaleMutex; //Mutex definition
};
Продавец.cpp:
boost::mutex Seller::ticketSaleMutex; //Mutex declaration
void Seller::StartTicketSale()
{
ticketSale = new boost::thread(boost::bind(&Seller::SellTickets, this));
}
void Seller::SellTickets()
{
while (*totalSoldTickets < totalNumTickets)
{
if ([Some time tick])
{
boost::mutex::scoped_lock(this->ticketSaleMutex);
(*totalSoldTickets)++;
std::cout << "Seller " << ID << " sold ticket " << *totalSoldTickets << std::endl;
}
}
}
основной.cpp:
int main(int argc, char**argv)
{
std::vector<Seller*> seller;
const int numSellers = 10;
int numTickets = 40;
int *soldTickets = new int;
*soldTickets = 0;
for (int i = 0; i < numSellers; i++)
{
seller.push_back(new Seller(i, numTickets, soldTickets));
seller[i]->StartTicketSale();
}
}
Seller::ticketSaleMutex
определенно должно работать. Это полностью эквивалентноthis->ticketSaleMutex
. - person rodrigo   schedule 25.07.2012