#include <unistd.h>
#include <pthread.h>
#include <stdio.h>
class Base {
protected:
pthread_t receiverThreadID;
Base() {
pthread_create(&receiverThreadID,NULL,threadFunction,this);
}
~Base() {
}
virtual void handleEvent() = 0;
static void* threadFunction(void* arg) {
while(true) {
// This threads receives UDP via recvfrom(). The messages can come in randomly. I use sleep() to simulate a blocking wait
sleep(1);
((Base*)arg)->handleEvent();
}
return 0;
}
};
class Derived : public Base {
virtual void handleEvent() {
// Do something
printf("hello\n");
}
public:
Derived() {}
~Derived() {}
};
int main() {
Derived derived;
sleep(10);
}
Вы не должны вызывать чистую виртуальную функцию от конструктора класса, но нормально ли создать поток в конструктор, который в свою очередь вызывает чистую виртуальную функцию? Есть ли риск для состояния гонки? У меня не было ошибок во время выполнения с приведенным выше кодом.Вызов чистой виртуальной функции в отдельном потоке, который создается из конструктора базового класса
Если код не подходит, как я сделал, как его решить?
Для обеспечения выполнения конструктора необходим механизм синхронизации. Здесь все, что имеет значение, когда поток создается, не имеет значения. – Donnie