Multithreading in MEX function using pthreads
6 次查看(过去 30 天)
显示 更早的评论
I am building a multi-threaded MEX function which uses pthreads. I followed the example from http://robertoostenveld.nl/?p=33, and everything is going fine, except that I get a segmentation fault every time pthread_join() is called (works fine if I comment out pthread_join, but I need this functionality). Here is the output from gdb when this happens:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffe35ea700 (LWP 20687)]
0x00007ffff4c5ef53 in pthread_join () from /lib/libpthread.so.0
Here is a simplified version of the code in my mexFunction():
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[] )
{
struct stableParams params;
/* Assign pointers to each input */
params.remCodePhase = *mxGetPr(prhs[0]);
params.remCarrPhase = *mxGetPr(prhs[1]);
/* etc */
/*struct funcArgs args[params.n_threads]; */
/* Create matrix for the return argument. */
plhs[0] = mxCreateDoubleScalar(0);
plhs[1] = mxCreateDoubleScalar(0);
/* etc */
/* Assign pointers to the output */
params.remCodePhaseOut = mxGetPr(plhs[6]);
params.remCarrPhaseOut = mxGetPr(plhs[7]);
/* etc */
struct Correlators correlators[params.n_threads];
params.correlators[params.n_threads] = correlators;
pthread_t threads[params.n_threads];
int rc, t;
for(t=1; t <= params.n_threads ; t++){
struct funcArgs *args = mxMalloc(sizeof(*args));
if (args){
args->params = params;
args->curr_thread = t;
mexPrintf("In main: creating thread %d\n", t);
rc = pthread_create(&threads[t], NULL, do_thread, (void *)args);
if (rc){
mexErrMsgTxt("problem with return code from pthread_create()");
}
}
}
int *ptr;
for(t=0; t< params.n_threads; t++){
int rc2=pthread_join(threads[t],(void**)&(ptr));
}
It's very possible I'm doing something wrong because I'm new to both C and pthreads. But has anyone managed to get pthreads working in a MEX function? I'm using, by the way, Ubuntu 10.04 and Matlab 2013a.
0 个评论
回答(1 个)
Jan
2013-7-1
编辑:Jan
2013-7-1
Do the threads reply a value by pthread_exit() or not? You call pthread_join twice, one time without catching the output and one time with it. You have to decide for one of the methods.
[EDITED] do_thread creates the variable used as output dynamically, such that the memory is released when the function returns. Then catching the pointer in the caller fails. Please try this:
int *ret2 = malloc(sizeof(int));
*ret2 = 200;
pthread_exit((void *) ret2)
另请参阅
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!