Re: no more thread scheduling when waitpid in one thread

Dan Kegel <[email protected]>
Newsgroups gmane.linux.ngpt.devel
Message-ID <[email protected]>
Hi Nadine,
I forwarded your question to the mailing list
for that 'other' thread package, NPTL.
They seem to think that both Linuxthreads
and NPTL would give the fair scheduling you're
expecting with your test case.
It's not clear what Posix mandates here, btw.

You can read the discussion at
https://listman.redhat.com/pipermail/phil-list/2002-November/000334.html
and https://listman.redhat.com/pipermail/phil-list/2002-December/000343.html

- Dan

nadine peyrouze wrote:
> Hello,
> 
> Running ngpt 2.0.4 on redhat linux kernel 2.4.19.
> 
> A simple program with 2 threads :
> - one thread print "="
> - one thread, forks and runs waitpid on the child
>  the child forked print "."
> - the main thread wait for joining with the above 2 threads
> 
> Running this program, I have the ouput :
> ...............
> and then
> ======
> 
> Should have mixed . and =
> 
> Do you know this problem and how to fix it ?
> Thanks.
> 
> Below is code used to test.
> 
> #ifdef GLOBAL
> #include <pthread.h>
> #else
> #define _PTHREAD_PRIVATE
> #include "pthread.h"
> #endif
> 
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> #include <unistd.h>
> #include <errno.h>
> #include <linux/unistd.h>
> #include <sys/types.h>
> #include <sys/wait.h>
> 
> #define die(str) \
>    do { \
>        fprintf(stderr, "**die: %s: errno=%d\n", str, errno); \
>        exit(1); \
>    } while (0)
> 
> static void *child_print(void *_arg)
> {
>    char *name = (char *)_arg;
>    int i=0;
>    fprintf(stderr, "child_print: startup %s \n", name);     
>    for (i = 0; i < 50; i++) {
>        if (i % 5 == 0)
>            sleep(1);
>        fprintf(stderr, "=");
>    }
>    fprintf(stderr,"\n");
> 
>    fprintf(stderr, "child_print: shutdown %s \n", name);
>    // _exit(0);    /* the process will exit */
>    return _arg;
> }
> 
> static void *child_fork(void *_arg)
> {
>    char *name = (char *)_arg;
>    int pid;
> 
>    fprintf(stderr, "child_fork: startup %s \n", name);
>       pid = fork();
>    if (pid == 0) {
>      /* we are in child */
>      int i=0;
>          for (i = 0; i < 50; i++) {
>        if (i % 5 == 0)
>            sleep(1);
>        fprintf(stderr, ".");
>      }
>      fprintf(stderr,"\n");
>    }
>    else {
>      int res=0;
>      int status=0;
> 
>      fprintf(stderr,"child_fork: waitpid\n");
>      res = waitpid(pid, &status, 0);
>      fprintf(stderr, "child_fork: shutdown %s \n", name);
>    }
>    // _exit(0);    /* the process will exit */
>    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");
>    if (argc > 1) {
>    /* create as bound-thread (as 1:1 mode) */
>    if (pthread_attr_setscope(&thread_attr, PTHREAD_SCOPE_SYSTEM) != 0)
>        die("pthread_attr_setscope");
>    }
> 
>    fprintf(stderr, "main: create child_print\n");
>    if (pthread_create(&thread[0], &thread_attr, child_print, (void 
> *)"child_print") != 0)
>        die("pthread_create");
> 
>    fprintf(stderr, "main: create child_fork\n");
>    if (pthread_create(&thread[1], &thread_attr, child_fork, (void 
> *)"child_fork") != 0)
>        die("pthread_create");
>        sleep(5);
> 
>    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);
> 
>    fprintf(stderr, "main: exit\n");
>    exit(0);
> }
> 
> 
> 
> _______________________________________________
> pthreads-devel mailing list
> [email protected]
> http://www-124.ibm.com/developerworks/oss/mailman/listinfo/pthreads-devel
> 
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.