Andrea
Andrea

Reputation: 111

pthread_create does not work when a pointer to an object is given as an argument

I don't understand why CLion IDE underlines "pthread_create" and "pthread_join" in red and says "No matching function for call to...". I used a similar code without using the pointer to an object passed to the thread as an argument and it worked.

#include <iostream>
#include <pthread.h>
#define NUM_THREADS 4


using namespace std;


class Animal {
private:
    float x, y;
public:
    Animal(float x, float y) {
        this->x = x;
        this->y = y;
    }
    void print() {
        cout<< x << "," << y << endl;
    }
};


void *function(Animal *p) {
    Animal animal = *p;
    animal.print();
}


int main() {
    pthread_t thread[NUM_THREADS];
    Animal dog[] = {Animal(2, 3), Animal(-1, 2), Animal(5, 2), Animal(5, 10)};

    for(int i = 0; i<NUM_THREADS; i++) {
        pthread_create(&thread[i], NULL, function, &dog[i]);
    }

    for(int i = 0; i<NUM_THREADS; i++) {
        pthread_join(thread[i]);
    }

    return 0;
}

Upvotes: 1

Views: 115

Answers (1)

Andrea
Andrea

Reputation: 111

I changed the argument of the childThread function from Animal to void *

void *childThread(void *p) {
    Animal *animal = (Animal *)p;
    animal->print(); 
}

And added a second argument NULL to pthread_join

pthread_join(thread, NULL)

and now it works

Upvotes: 1

Related Questions