Cześć!
Programując już kilka lat w octavie ciągle brakowało mi wątków. Co jakiś czas przegrzebywałem internet ale nic na ten temat nie znajdowałem.
Dziś postanowiłem sprawdzić czy to jest możliwe. Stworzyłem na szybko funkcję:
#include <octave/oct.h>
#include <octave/parse.h>
#include <pthread.h>
struct eval_data_t{
octave_function *func;
};
void * eval(void *p){
octave_value_list newargs;
struct eval_data_t * data = (struct eval_data_t *)p;
feval(data->func, newargs, 0);
free(data);
return 0;
}
DEFUN_DLD(func1, args, nargout, "Func1"){
pthread_t thread;
struct eval_data_t * data;
data = (struct eval_data_t *)malloc(sizeof(struct eval_data_t));
data->func = args(0).function_value();
pthread_create(&thread, NULL, eval, (void*)data);
return octave_value_list();
}
Odpaliłem:
function test2()
global a;
a = 0;
func1(@foo);
sleep(0.3);
a = 5;
end
function foo()
global a;
a = 2;
for i=1:10
disp(['Foo ', num2str(a)]);
fflush(stdout);
sleep(0.1);
end
end
I uzyskałem oczekiwany wynik:
octave:38> test2();
Foo 2
Foo 2
Foo 2
octave:39> Foo 5
Foo 5
Foo 5
Foo 5
Foo 5
Foo 5
Foo 5
Ekstra, jest to możliwe!
Pozostaje tylko ładnie ponazywać funkcję, obsłużyć błędy, upodobnić do POSIX'owego pthread'a, plus ewentualnie jakieś mutexy.
Pytanko, czy jest sens? Czy na pewno nie ma wątków w octavie?
Poszło mi to dość łatwo i dziwię się że nie mogę znaleźć gotowego rozwiązania...