hi, I am searching for a response for couple of days over le net irc faqs etc so i finaly decided to write to this mailing, sorry if the question as already been sent. I wrote a multithreaded server program on Linux using Linux pthread library which work fine but when I tried to use it on obsd, I came into troubles ... It compils fine using the pthread emultation of the GNU pth library but when i tried to use the resulting program, nothing happened, threads are created but never start, they seem to be sleeping (?!) . I think it was due to some I/O blocking function but it wasn't that. So i tried de pthread example of the GNU pth package (test_pthread.c) ... same pb, it didn't work. here is the output of the program. The source (supposed to work) is attached:
-------------------------------- gcc -D_REENTRANT test_pthread.c -lpthread #> ./a.out <(10:40:23) main: init main: initializing attribute object **die: pthread_attr_setdetachstate: errno=22 -------------------------------- apparently the PTHREAD_CREATE_JOINABLE option is not allowed ... (22 == invalid argument), I tried to replace it with PTHREAD_CREATE_DETACHED and placing a big sleep() ... ... the output : -------------------------------- #> ./a.out <(10:51:23) main: init main: initializing attribute object main: create thread 1 main: create thread 2 main: create thread 3 main: create thread 4 main: destroying attribute object main: exit -------------------------------- thread are created but they never do their job ... HELP !!! PLEASE :-(( Fugu joinable.c : #ifdef GLOBAL #include <pthread.h> #else #include "pthread.h" #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #define die(str) \ do { \ fprintf(stderr, "**die: %s: errno=%d\n", str, errno); \ exit(1); \ } while (0) static void *child(void *_arg) { char *name = (char *)_arg; int i; fprintf(stderr, "child: startup %s\n", name); for (i = 0; i < 100; i++) { if (i++ % 10 == 0) sleep(1); fprintf(stderr, "child: %s counts i=%d\n", name, i); } fprintf(stderr, "child: shutdown %s\n", name); return _arg; } int main(int argc, char *argv[]) { pthread_attr_t thread_attr; pthread_t thread[4]; char *rc; fprintf(stderr, "main: init\n"); fprintf(stderr, "main: initializing attribute object\n"); if (pthread_attr_init(&thread_attr) != 0) die("pthread_attr_init"); if (pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_JOINABLE) != 0) die("pthread_attr_setdetachstate"); fprintf(stderr, "main: create thread 1\n"); if (pthread_create(&thread[0], &thread_attr, child, (void *)"foo") != 0) die("pthread_create"); fprintf(stderr, "main: create thread 2\n"); if (pthread_create(&thread[1], &thread_attr, child, (void *)"bar") != 0) die("pthread_create"); fprintf(stderr, "main: create thread 3\n"); if (pthread_create(&thread[2], &thread_attr, child, (void *)"baz") != 0) die("pthread_create"); fprintf(stderr, "main: create thread 4\n"); if (pthread_create(&thread[3], &thread_attr, child, (void *)"quux") != 0) die("pthread_create"); fprintf(stderr, "main: destroying attribute object\n"); if (pthread_attr_destroy(&thread_attr) != 0) die("pthread_attr_destroy"); sleep(3); fprintf(stderr, "main: joining...\n"); if (pthread_join(thread[0], (void **)&rc) != 0) die("pthread_join"); fprintf(stderr, "main: joined thread: %s\n", rc); if (pthread_join(thread[1], (void **)&rc) != 0) die("pthread_join"); fprintf(stderr, "main: joined thread: %s\n", rc); if (pthread_join(thread[2], (void **)&rc) != 0) die("pthread_join"); fprintf(stderr, "main: joined thread: %s\n", rc); if (pthread_join(thread[3], (void **)&rc) != 0) die("pthread_join"); fprintf(stderr, "main: joined thread: %s\n", rc); fprintf(stderr, "main: exit\n"); return 0; } detached.c: #ifdef GLOBAL #include <pthread.h> #else #include "pthread.h" #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #define die(str) \ do { \ fprintf(stderr, "**die: %s: errno=%d\n", str, errno); \ exit(1); \ } while (0) static void *child(void *_arg) { char *name = (char *)_arg; int i; fprintf(stderr, "child: startup %s\n", name); for (i = 0; i < 100; i++) { if (i++ % 10 == 0) sleep(1); fprintf(stderr, "child: %s counts i=%d\n", name, i); } fprintf(stderr, "child: shutdown %s\n", name); return _arg; } int main(int argc, char *argv[]) { pthread_attr_t thread_attr; pthread_t thread[4]; char *rc; fprintf(stderr, "main: init\n"); fprintf(stderr, "main: initializing attribute object\n"); if (pthread_attr_init(&thread_attr) != 0) die("pthread_attr_init"); if (pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED) != 0) die("pthread_attr_setdetachstate"); fprintf(stderr, "main: create thread 1\n"); if (pthread_create(&thread[0], &thread_attr, child, (void *)"foo") != 0) die("pthread_create"); fprintf(stderr, "main: create thread 2\n"); if (pthread_create(&thread[1], &thread_attr, child, (void *)"bar") != 0) die("pthread_create"); fprintf(stderr, "main: create thread 3\n"); if (pthread_create(&thread[2], &thread_attr, child, (void *)"baz") != 0) die("pthread_create"); fprintf(stderr, "main: create thread 4\n"); if (pthread_create(&thread[3], &thread_attr, child, (void *)"quux") != 0) die("pthread_create"); fprintf(stderr, "main: destroying attribute object\n"); if (pthread_attr_destroy(&thread_attr) != 0) die("pthread_attr_destroy"); sleep(13); /* fprintf(stderr, "main: joining...\n"); if (pthread_join(thread[0], (void **)&rc) != 0) die("pthread_join"); fprintf(stderr, "main: joined thread: %s\n", rc); if (pthread_join(thread[1], (void **)&rc) != 0) die("pthread_join"); fprintf(stderr, "main: joined thread: %s\n", rc); if (pthread_join(thread[2], (void **)&rc) != 0) die("pthread_join"); fprintf(stderr, "main: joined thread: %s\n", rc); if (pthread_join(thread[3], (void **)&rc) != 0) die("pthread_join"); fprintf(stderr, "main: joined thread: %s\n", rc); */ fprintf(stderr, "main: exit\n"); return 0; } ______________________________________________________________________ GNU Portable Threads (Pth) http://www.gnu.org/software/pth/ User Support Mailing List [EMAIL PROTECTED] Automated List Manager (Majordomo) [EMAIL PROTECTED]