Расширение RubyInline C - pthread_create вызывает функцию ruby - PullRequest
0 голосов
/ 12 марта 2012

Я пытаюсь применить многопоточность C к методу ruby, но не могу правильно вызвать метод ruby. Сейчас я просто тестирую один поток, и я не передаю какие-либо параметры просто для простоты.

Вот код

require 'inline'

class ExampleThread

def my_thread
    puts 'running thread';
end

inline :C do |builder|
    builder.include "<pthread.h>"
    builder.c '
    static VALUE run_thread(void){
        ID my_thread    = rb_intern("my_thread");

        pthread_t pth;

        // normal ruby function call
        // rb_funcall(self, my_thread, 0);
        // but I want to try with threads
        pthread_create(&pth,NULL,my_thread,NULL);

        pthread_join(pth, NULL);

        return Qnil;
    }'
end

end

а вот и ошибка

warning: passing argument 3 of ‘pthread_create’ makes pointer from integer without a cast

# => РЕДАКТИРОВАТЬ

Читая ваши комментарии, я решил изменить код, и вот что я до сих пор придумал.

require 'inline'

class Example

  inline :C do |builder|
  builder.include "<pthread.h>"

    builder.c '
    static void run_thread(VALUE name){
        // I added a ruby User class to test posting a variable from thread to db
        VALUE user = rb_const_get( rb_cObject, rb_intern("User") );         
        rb_funcall(user, rb_intern("add"), 1, name);
    }'


    builder.c '
    static void simple(VALUE name){
        run_thread(self, name);
    }'      


    builder.c '
    static void threads(VALUE name){
        pthread_t pth;

        pthread_create(&pth, NULL, (void *)run_thread, (VALUE *)name );

        pthread_join(pth, NULL);
    }'              
end     

end

если я запускаю Example.new.run_thread ("Адам"), я получаю ожидаемый результат

(0.3ms)  BEGIN
SQL (19.9ms)  INSERT INTO `users` (`created_at`, `name`, `updated_at`) VALUES ('2012-03-16 04:53:15', 'Adam', '2012-03-16 04:53:15')
(0.5ms)  COMMIT

если я запускаю Example.new.simple ("Адам"), я получаю ожидаемый результат

(0.3ms)  BEGIN
SQL (19.9ms)  INSERT INTO `users` (`created_at`, `name`, `updated_at`) VALUES ('2012-03-16 04:53:15', 'Adam', '2012-03-16 04:53:15')
(0.5ms)  COMMIT

если я запускаю Example.new.threads ("Адам"), я получаю ошибку

[FATAL] failed to allocate memory

Насколько я понимаю, я должен использовать память ALLOC для получения ожидаемого результата, но этот процесс мне не совсем понятен, и я не знаю, как его реализовать.

1 Ответ

0 голосов
/ 12 марта 2012

Я делаю рубин. То, что вы упомянули, просто предупреждение. Таким образом, объектный файл будет создан. Запустить его. Это может работать нормально, как вы ожидали. Предупреждение говорит только о проблеме кастинга. Так что явно приведите my_thread к пустому указателю и скомпилируйте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...