Creating a boost thread in a matlab mex file causes matlab to crash

I'm having some issues getting matlab and boost threads to work together. I'm posting here and a number of other places as I don't think this problem fits into any one domain. Specifically, whenever I try to use boost threads within a mex file, it causes matlab to crash. My test program is: #include <boost/thread/thread.hpp> #include <boost/bind.hpp> #include "mex.h" class TestClass { public: void run(); }; void TestClass::run() { for (int n = 0; n < 5; n++) { sleep(1); } } void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { TestClass tc; boost::thread *pThread = new boost::thread(boost::bind(&TestClass::run, &tc)); pThread->join(); } The matlab crash output is as follows Configuration: MATLAB Version: 7.7.0.471 (R2008b) MATLAB License: 166534 Operating System: Linux 2.6.18-128.1.6.el5.centos.plusPAE #1 SMP Thu Apr 2 13:33:12 EDT 2009 i686 GNU C Library: 2.5 stable Processor ID: x86 Family 6 Model 7 Stepping 10, GenuineIntel Virtual Machine: Java 1.6.0_04 with Sun Microsystems Inc. Java HotSpot(TM) Client VM mixed mode Default Encoding: ISO-8859-1 Fault Count: 1 Register State: eax = 00d6bf00 ebx = 003cf590 ecx = 040571cc edx = 040571d0 esi = 04057124 edi = 00000000 ebp = a72ba3b8 esp = a72ba37c eip = 56e58955 flg = 00010246 Stack Trace: [0] 0x56e58955(0x04057124, 2, 2, 2) [1] libpthread.so.0:0x0038949b(0xa72bab90, 0, 0, 0) Running GDB on the application reveals that at the time of crashing, there are 13 threads. The backtrace for the created thread / parent thread is given below: Thread 13 (created thread) #0 0x56e58955 in ?? () #1 0x0031daf2 in thread_proxy (param=0x4241124) at ./boost/function/function_template.hpp:647 #2 0x0067049b in start_thread () from /lib/libpthread.so.0 #3 0x005c742e in clone () from /lib/libc.so.6 Thread 12 (parent thread) #0 0x003da410 in __kernel_vsyscall () #1 0x00674595 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/libpthread.so.0 #2 0x0031b164 in boost::detail::condition_impl::do_wait (this=0x4241140, pmutex=0x4241124) at libs/thread/src/condition.cpp:371 #3 0x0031dd51 in thread (this=0x96c9c28, threadfunc=@0x42411cc) at ./boost/thread/condition.hpp:150 #4 0x00e9a7c2 in mexFunction (nlhs=0, plhs=0x42418fc, nrhs=0, prhs=0x424195c) at threadtest.cpp:25 #5 0x003e584f in mexRunMexFile () from /usr/local/matlabR2008b/bin/glnx86/../../bin/glnx86/../../bin/glnx86/libmex.so I am using: CentOS version 5.3 Boost version 1.33.1 (the one that comes with CentOS 5.3) Matlab R2008b release GCC version 4.1.2 (again, the one that comes with CentOS 5.3) The line used to compile the code: mex -g threadtest.cpp -lboost_thread Any ideas? -- View this message in context: http://www.nabble.com/Creating-a-boost-thread-in-a-matlab-mex-file-causes-ma... Sent from the Boost - Users mailing list archive at Nabble.com.

bjs109 wrote:
I'm having some issues getting matlab and boost threads to work together. I'm posting here and a number of other places as I don't think this problem fits into any one domain.
Specifically, whenever I try to use boost threads within a mex file, it causes matlab to crash.
...[snip]...
Any ideas?
First thought. Have you tried a similar program that does not use boost threads, but instead creates the threads directly via pthreads? If this also crashes the same way, then boost threads is not the cause of the problem. If it does not crash, then boost threads is involved in the problem. Second thought. If you find that boost threads is involved in the problem, you might try updating your boost installation to the current version (1.39). The version included with your CentOS is more than 3 1/2 years old, and according to Anthony's release notes almost every line of the code has been rewritten since then. That is at least the steps I would start with. John

All very logical steps, and steps which I'm sure I tried at some point ;) Firstly, the posix threads solution works just fine, I've included the program I tested (a slight modification of a standard example program). /* * p_hello.c -- a hello program (in pthread) */ #include "mex.h" #include <stdio.h> #include <sys/types.h> #include <pthread.h> #define MAX_THREAD 1000 typedef struct { int id; } parm; void *hello(void *arg) { parm *p=(parm *)arg; printf("Hello from node %d\n", p->id); return (NULL); } void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { int n,i; pthread_t *threads; pthread_attr_t pthread_custom_attr; parm *p; n=3; if ((n < 1) || (n > MAX_THREAD)) { printf ("The no of thread should between 1 and %d.\n",MAX_THREAD); exit(1); } threads=(pthread_t *)malloc(n*sizeof(*threads)); pthread_attr_init(&pthread_custom_attr); p=(parm *)malloc(sizeof(parm)*n); /* Start up thread */ for (i=0; i<n; i++) { p[i].id=i; pthread_create(&threads[i], &pthread_custom_attr, hello, (void *)(p+i)); } /* Synchronize the completion of each thread. */ for (i=0; i<n; i++) { pthread_join(threads[i],NULL); } free(p); } I tried using boost version 1.38, I realize it's not quite the latest version but it's the latest version easily available to me at the moment. I used the application documented at the start of this thread. Once again, we have a crash dump from matlab: ------------------------------------------------------------------------ Segmentation violation detected at Thu Jun 25 09:37:20 2009 ------------------------------------------------------------------------ Configuration: MATLAB Version: 7.7.0.471 (R2008b) MATLAB License: 166534 Operating System: Linux 2.6.18-128.1.6.el5.centos.plusPAE #1 SMP Thu Apr 2 13:33:12 EDT 2009 i686 GNU C Library: 2.5 stable Window System: No active display Current Visual: None Processor ID: x86 Family 6 Model 7 Stepping 10, GenuineIntel Virtual Machine: Java 1.6.0_04 with Sun Microsystems Inc. Java HotSpot(TM) Client VM mixed mode Default Encoding: ISO-8859-1 Fault Count: 1 Register State: eax = 00000000 ebx = 0067eff4 ecx = a830d4a4 edx = a830dbd8 esi = 098d7dd0 edi = 098d7260 ebp = 05a64168 esp = 05a64130 eip = 0067149e flg = 00010202 Stack Trace: [0] libpthread.so.0:pthread_join~(0, 0, 0x098d7270, 0x08aeeae4 "¤)") + 30 bytes [1] libboost_thread-gcc41-mt-1_34_1.so.1.34.1:boost::thread::join()~(0x098d7dd0, 0x098d7264, 0x098d7260, 0x05a641df) + 42 bytes [2] threadtest.mexglx:mexFunction~(0, 0x05a648fc, 0, 0x05a6495c) + 1266 bytes [3] libmex.so:mexRunMexFile(0, 0x05a648fc, 0, 0x05a6495c) + 111 bytes [4] libmex.so:Mfh_mex::runMexFileWithSignalProtection(int, mxArray_tag**, int, mxArray_tag**)(0x098cc8f0 "HÑL", 0, 0x05a648fc, 0) + 119 bytes [5] libmex.so:Mfh_mex::dispatch_file(int, mxArray_tag**, int, mxArray_tag**)(0x098cc8f0 "HÑL", 0, 0x05a648fc, 0) + 257 bytes [6] libmwm_dispatcher.so:Mfh_file::dispatch_fh(int, mxArray_tag**, int, mxArray_tag**)(0x098cc8f0 "HÑL", 0, 0x05a648fc, 0) + 278 bytes [7] libmwm_interpreter.so:inDispatchFromStack(int, char const*, int, int)(561, 0x098cb6bc "threadtest", 0, 0) + 1074 bytes [8] libmwm_interpreter.so:inDispatchCall(char const*, int, int, int, int*, int*)(0, 0x05a64c18, 0x098d7ca8, 0x007c3170) + 160 bytes [9] libmwm_interpreter.so:.L718(1, 0, 1, 0) + 183 bytes [10] libmwm_interpreter.so:protected_inInterp(inDebugCheck, int, int, opcodes, inPcodeNest_tag*, int*)(1, 0, 1, 0) + 120 bytes [11] libmwm_interpreter.so:inInterPcodeSJ(inDebugCheck, int, int, opcodes, inPcodeNest_tag*, int*)(0, 0x098e2dc0, 0x05a6507c, 0x05a6507c) + 286 bytes [12] libmwm_interpreter.so:inExecuteMFunctionOrScript(Mfh_mp*, bool)(0x098c7ef8, 1, 0x05a65ec8, 0) + 803 bytes [13] libmwm_interpreter.so:inRunMfile(int, mxArray_tag**, int, mxArray_tag**, Mfh_mp*, inWorkSpace_tag*)(0, 0x05a65ec8, 0, 0) + 676 bytes [14] libmwm_interpreter.so:Mfh_mp::dispatch_file(_mdUnknown_workspace*, int, mxArray_tag**, int, mxArray_tag**)(0x098c7ef8, 0, 0, 0x05a65ec8) + 64 bytes [15] libmwm_interpreter.so:Mfh_mp::dispatch_file(int, mxArray_tag**, int, mxArray_tag**)(0x098c7ef8, 0, 0x05a65ec8, 0) + 56 bytes [16] libmwm_dispatcher.so:Mfh_file::dispatch_fh(int, mxArray_tag**, int, mxArray_tag**)(0x098c7ef8, 0, 0x05a65ec8, 0) + 278 bytes [17] libmwm_interpreter.so:inEvalPcodeHeaderToWord(_memory_context*, int, mxArray_tag**, _pcodeheader*, Mfh_mp*, unsigned int)(1954952, 0, 0x05a65ec8, 0x05a65d78) + 199 bytes [18] libmwm_interpreter.so:in_local_call_script_function(_memory_context*, _pcodeheader*, int, mxArray_tag**, unsigned int, bool)(0x05a65ec8, 0, 0, 0x01031396) + 108 bytes [19] libmwm_interpreter.so:inEvalStringWithIsVarFcn(_memory_context*, char const*, EvalType, int, mxArray_tag**, inDebugCheck, _pcodeheader*, int*, bool (*)(void*, char const*), void*, bool, bool)(0, 0x05a65ec8, 0, 0) + 2884 bytes [20] libmwm_interpreter.so:InterpBridge::EvalCmdWithLocalReturn(char const*, int*, bool, bool)(0x08bd6e48, 0x098beda0 "threadtest\n", 0, 0) + 151 bytes [21] libmwm_interpreter.so:inEvalCmdWithLocalReturn(0x098beda0 "threadtest\n", 0, 0, 1) + 74 bytes [22] libmwbridge.so:evalCommandWithLongjmpSafety(char const*)(0x098beda0 "threadtest\n", 1, 2746196, 0xb7fc9688) + 116 bytes [23] libmwbridge.so:mnParser(0x098dac00 "x1|", 0x092a2b70 "(öb", 1, 0x08be19b8) + 283 bytes [24] libmwmcr.so:mcrInstance::mnParser()(0x08be19f0, 0x05a66364, 0x08be19b8, 0x08be1a28) + 112 bytes [25] MATLAB:mcrMain(int, char const**)(1, 0xbfb602c4, 5, 0) + 538 bytes [26] libmwmcr.so:runMcrMain(void*)(0xbfb601e8, 0x05a66470 "ôïg", 0x05a66470 "ôïg", 0x05a66470 "ôïg") + 38 bytes [27] libpthread.so.0:0x0067049b(0x05a66b90, 0, 0, 0) And using GDB I obtained the following stack dumps: Thread 12 #0 0x0067149e in pthread_join () from /lib/libpthread.so.0 #1 0x0029055a in boost::thread::join (this=0x9540928) at libs/thread/src/thread.cpp:226 #2 0x00d69296 in mexFunction () from /home/ben/eclipse/ws-sandbox/SandboxWS/libASAMatlab/src/threadtest.mexglx #3 0x0035b84f in mexRunMexFile () from /usr/local/matlabR2008b/bin/glnx86/../../bin/glnx86/../../bin/glnx86/libmex.so #4 0x00358891 in ?? () from /usr/local/matlabR2008b/bin/glnx86/../../bin/glnx86/../../bin/glnx86/libmex.so #5 0x00359cfb in ?? () from /usr/local/matlabR2008b/bin/glnx86/../../bin/glnx86/../../bin/glnx86/libmex.so #6 0x0031b340 in Mfh_file::dispatch_fh () from /usr/local/matlabR2008b/bin/glnx86/../../bin/glnx86/libmwm_dispatcher.so #7 0x00f37d5a in ?? () from /usr/local/matlabR2008b/bin/glnx86/../../bin/glnx86/libmwm_interpreter.so #8 0x00ee5d84 in ?? () from /usr/local/matlabR2008b/bin/glnx86/../../bin/glnx86/libmwm_interpreter.so #9 0x00ee7127 in ?? () from /usr/local/matlabR2008b/bin/glnx86/../../bin/glnx86/libmwm_interpreter.so #10 0x00eea0de in ?? () from /usr/local/matlabR2008b/bin/glnx86/../../bin/glnx86/libmwm_interpreter.so #11 0x00ee8f62 in ?? () from /usr/local/matlabR2008b/bin/glnx86/../../bin/glnx86/libmwm_interpreter.so #12 0x00ee99a9 in ?? () from /usr/local/matlabR2008b/bin/glnx86/../../bin/glnx86/libmwm_interpreter.so #13 0x00f4b7fe in ?? () from /usr/local/matlabR2008b/bin/glnx86/../../bin/glnx86/libmwm_interpreter.so #14 0x00f24d30 in ?? () from /usr/local/matlabR2008b/bin/glnx86/../../bin/glnx86/libmwm_interpreter.so #15 0x00f23c20 in ?? () from /usr/local/matlabR2008b/bin/glnx86/../../bin/glnx86/libmwm_interpreter.so #16 0x0031b340 in Mfh_file::dispatch_fh () from /usr/local/matlabR2008b/bin/glnx86/../../bin/glnx86/libmwm_dispatcher.so #17 0x00f2cb7d in ?? () from /usr/local/matlabR2008b/bin/glnx86/../../bin/glnx86/libmwm_interpreter.so #18 0x00edc93c in ?? () from /usr/local/matlabR2008b/bin/glnx86/../../bin/glnx86/libmwm_interpreter.so #19 0x00ee0ad0 in ?? () from /usr/local/matlabR2008b/bin/glnx86/../../bin/glnx86/libmwm_interpreter.so #20 0x00ee10c5 in ?? () from /usr/local/matlabR2008b/bin/glnx86/../../bin/glnx86/libmwm_interpreter.so #21 0x00eaed28 in inEvalCmdWithLocalReturn () from /usr/local/matlabR2008b/bin/glnx86/../../bin/glnx86/libmwm_interpreter.so #22 0x00d943fc in ?? () from /usr/local/matlabR2008b/bin/glnx86/../../bin/glnx86/libmwbridge.so #23 0x00d951d5 in mnParser () from /usr/local/matlabR2008b/bin/glnx86/../../bin/glnx86/libmwbridge.so #24 0x00d2215e in mcrInstance::mnParser () from /usr/local/matlabR2008b/bin/glnx86/../../bin/glnx86/libmwmcr.so #25 0x080491c8 in __gxx_personality_v0 () at ../../../../../../sources/gcc/libstdc++-v3/libsupc++/eh_personality.cc:349 #26 0x00d1d78a in ?? () from /usr/local/matlabR2008b/bin/glnx86/../../bin/glnx86/libmwmcr.so #27 0x0067049b in start_thread () from /lib/libpthread.so.0 #28 0x005c742e in clone () from /lib/libc.so.6 Thread 13 #0 0x006738b0 in pthread_mutex_unlock () from /lib/libpthread.so.0 #1 0x0260f1f1 in boost::call_once<void (*)()> () from /usr/lib/libboost_thread-gcc41-mt-1_38.so.1.38.0 #2 0x0260beda in boost::detail::set_current_thread_data () from /usr/lib/libboost_thread-gcc41-mt-1_38.so.1.38.0 #3 0x0260cff3 in thread_proxy () from /usr/lib/libboost_thread-gcc41-mt-1_38.so.1.38.0 #4 0x0067049b in start_thread () from /lib/libpthread.so.0 #5 0x005c742e in clone () from /lib/libc.so.6 Just for fun I wrote another program to see if the problem was anything to do with boost mutexes or conditions (without using other threads), and matlab has no issues with this. -- View this message in context: http://www.nabble.com/Creating-a-boost-thread-in-a-matlab-mex-file-causes-ma... Sent from the Boost - Users mailing list archive at Nabble.com.
participants (2)
-
bjs109
-
John Phillips