#include #include #include #if !defined(_WIN32) #include #else #include #endif #define SIZE 10 #define COUNT 10 #define TST int i, a[2], b[2]; \ for (i = 0; i < 2; i++) a[i] = 0; \ for (i = 0; i < 2; i++) b[i] = 0 static int count[SIZE]; static void tst1 (jmp_buf loc) { TST; longjmp(loc, 1); } static void tst2(jmp_buf loc) { jmp_buf jmp; setjmp (jmp); TST; tst1(loc); } static void *tst (void * index) { jmp_buf loc; int i = *(int *) index; static int v[SIZE]; for (v[i] = 0; v[i] < COUNT; v[i]++) { if (setjmp (loc) == 0) { TST; tst2(loc); } else { count[i]++; } i = *(int *) index; } return NULL; } int main (void) { int i; #if !defined(_WIN32) pthread_t id[SIZE]; #else HANDLE id[SIZE]; #endif int index[SIZE]; for (i = 0; i < SIZE; i++) { index[i] = i; #if !defined(_WIN32) pthread_create (&id[i], NULL, tst, (void *) &index[i]); #else id[i] = CreateThread(NULL, 8192, (LPTHREAD_START_ROUTINE) tst, (void *) &index[i], 0, NULL); #endif } for (i = 0; i < SIZE; i++) { #if !defined(_WIN32) pthread_join (id[i], NULL); #else WaitForSingleObject(id[i], INFINITE); #endif } for (i = 0; i < SIZE; i++) { if (count[i] != COUNT) printf ("error: %d %d\n", i, count[i]); } return 0; }