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]

Reply via email to