私は並行プログラミングを学んでおり、私がやりたいのは、各オブジェクトが独自のBoost:Threadの実行を担当するクラスを持つことです。このコードは、私があまり慣れていない多くの機能(動的に割り当てられたメモリ、関数ポインター、同時実行性など)を使用しているため、少し頭がおかしくなります。それは、コードのすべての行がそれを正しくするためにいくつかの参照をチェックしなければならなかったようなものです。
(はい、割り当てられたすべてのメモリは実際のコードで考慮されます!)
ミューテックスに問題があります。私はそれを静的と宣言し、すべてのインスタンスで同じ値を取得しているようです(そうあるべきです)。コードはまだスレッドセーフではありません。
ミューテックスは、他の誰かがスレッドをロックした場合に備えて、スレッド(右?)がそれ以上進行しないようにする必要があります。ミューテックスはスコープが設定されており(優れた機能の一種)、ifステートメント内にあるため、他のスレッドを探す必要はありませんか?それでも私は、スレッドセーフではないことを明確に示唆するコンソール出力を取得します。
また、静的な変数の権利を使用しているかどうかもわかりません。さまざまな参照方法(Seller :: ticketSaleMutex)を試しましたが、機能したのは「this-> ticketSaleMutex」だけでした。これは非常に日陰に見え、静的であるという目的に反しているようです。
Seller.h:
class Seller
{
public:
//Some vaiables
private:
//Other variables
static boost::mutex ticketSaleMutex; //Mutex definition
};
Seller.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;
}
}
}
main.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();
}
}