Я пытаюсь применить многопоточность 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 для получения ожидаемого результата, но этот процесс мне не совсем понятен, и я не знаю, как его реализовать.