У меня проблема с использованием потоков в расширении C для запуска асинхронного кода ruby.
У меня есть следующий код C:
struct DATA {
VALUE callback;
pthread_t watchThread;
void *ptr;
};
void *executer(void *ptr) {
struct DATA *data = (struct DATA *) ptr;
char oldVal[20] = "1";
char newVal[20] = "1";
pthread_cleanup_push(&threadGarbageCollector, data);
while(1) {
if(triggerReceived) {
rb_funcall(data->callback, rb_intern("call"), 0);
}
}
pthread_cleanup_pop(1);
return NULL;
}
VALUE spawn_thread(VALUE self) {
VALUE block;
struct DATA *data;
Data_Get_Struct(self, struct DATA, data);
block = rb_block_proc();
data->callback = block;
pthread_create(&data->watchThread, NULL, &executer, data);
return self;
}
Я использую это, потому что хочу предоставить ruby-код в качестве обратного вызова, который будет выполнен, как только поток получит сигнал.
В целом это работает нормально, если обратный вызов выглядит примерно так:
1 + 1
Но, если обратные вызовы, ruby-код выглядит так:
puts "test"
чем основной процесс ruby перестанет отвечать после выполнения обратного вызова. Поток все еще работает и может реагировать на сигналы и ставит «тест» каждый раз, когда поток получает сообщение.
Может кто подскажет, как это исправить?
Большое спасибо