0

クラス、pthread、mutex、および conds を使用して単純な理髪店の C/C++ プロジェクトを作成していますが、ループ内で新しい顧客オブジェクトを作成すると問題が発生します。

void BarberShop::simulate() {
barber.start(); // start the barber
int custId = 1;
while(1) {
    Customer c(custId, *this);
    customers.push_back(c);
    c.start();
    sleep(3);
    custId++;
}

}

void Customer::start() {
    pthread_create(&thread, NULL, &Customer::run, this);
}

void* Customer::run(void *ptr) {
    Customer* data = reinterpret_cast<Customer*>(ptr);
    while(1) {
        printf("Customer %d running...\n", data->id);
        sleep(3);
    }
}

このプログラムを実行すると、スレッドは正常に作成されますが、新しいスレッドを作成するたびに、他のスレッドの ID が上書きされます。出力:

Customer 1 running... 1 sec
Customer 1 running... 2 sec
Customer 1 running... 3 sec
Customer 2 running... 4 sec
Customer 2 running... 4 sec

ループで私は言う:

Customer c(...);

ループの繰り返しごとに新しいインスタンスを作成しませんか? 後続のスレッドがこれを上書きするのはなぜですか?

アップデート

class Customer
{
private:
    pthread_t thread;
    pthread_cond_t cond;
    pthread_mutex_t mutex;
    static void* run(void *args);
    int id;
    BarberShop *bs;
public:
    Customer(int _id, BarberShop &_bs);
    ~Customer();
    void start();
}; 

Customer::Customer(int _id, BarberShop &_bs) {
id = _id;
bs = &_bs;
}

更新 2: pthread id を使用

Customer 1 running...[3066383168]
Customer 2 running...[3057990464]
Customer 2 running...[3057990464]
Customer 3 running...[3049597760]
Customer 3 running...[3049597760]
Customer 3 running...[3049597760]
Customer 3 running...[3049597760]
Customer 4 running...[3049597760]
Customer 4 running...[3041205056]
Customer 4 running...[3041205056]
Customer 4 running...[3041205056]
Customer 5 running...[3041205056]
Customer 4 running...[3041205056]
Customer 5 running...[3032812352]
Customer 5 running...[3032812352]
4

2 に答える 2