3

私は並行プログラミングを学んでおり、私がやりたいのは、各オブジェクトが独自の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();
    }
}
4

1 に答える 1

12

これにより、すぐに破棄される一時が作成されます。

boost::mutex::scoped_lock(this->ticketSaleMutex);

同期が発生しません。変数を宣言する必要があります。

boost::mutex::scoped_lock local_lock(this->ticketSaleMutex);
于 2012-07-24T21:24:37.047 に答える