in reply to XS: free() outside of the main thread causes crash on Windows

XS is Perl-aware glue, and as such, Perl redefines certain functions to Perl-aware functions.

I'd start by separating your Perl-incompatible stuff (non-Perl threads, and the non-Perl memory allocation) from XS. A separate file would be good, but the following might suffice.

#include <pthread.h> void *thread(void *arg) { char *msg = (char*)arg; printf("thread: %s\n", msg); free(msg); return NULL; } void test_thread(const char *msg) { char *thread_arg = malloc((strlen(msg)+1)*sizeof(char)); strcpy(thread_arg, msg); pthread_t tid; pthread_create(&tid, NULL, thread, (void*)thread_arg); void *rv; pthread_join(tid, &rv); } #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "ppport.h" MODULE = My PACKAGE = My void test_thread(const char *msg)

Note that mid-block variable declarations (like thread_arg, tid and rv in your code, and the latter two in mine) aren't legal C89 which Perl supports. Of course, it doesn't mean you have to support it.