Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 19 Feb 2005 22:17:54 +0900
From:      Kazuaki Oda <kaakun@highway.ne.jp>
To:        Daniel Eischen <deischen@freebsd.org>
Cc:        threads@freebsd.org
Subject:   Re: thread accounting in libpthread
Message-ID:  <42173C82.7040408@highway.ne.jp>
In-Reply-To: <Pine.GSO.4.43.0502181355340.16670-100000@sea.ntplx.net>
References:  <Pine.GSO.4.43.0502181355340.16670-100000@sea.ntplx.net>

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------070804040805030500010306
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Daniel Eischen wrote:

>On Sat, 19 Feb 2005, Kazuaki Oda wrote:
>  
>
>>And while looking at thr_kern.c, I've had one more question.
>>In kse_switchout_thread, after calling thr_accounting thread is placed
>>at the tail of run queue or at the head of it according to
>>thread->slice_usec.
>>But in kse_check_completed, thread is just placed at the tail of run queue.
>>Is there any reason why thread is not placed at the head of run queue in
>>case of thread->slice_usec != -1?
>>    
>>
>
>Because it already blocked and we don't want to needlessly
>switch out a currently running thread that hasn't used its
>quantum.
>
>  
>

Blocked?  I think that completed threads are *not* blocked and they are 
ready
to run except for suspended.  And, kse_check_completed could be called after
calling kse_wait.  In this case there is currently no running thread.

The reason why I am researching libpthread is that the attached program 
shows
--------------------
thread 00: 55666
thread 01: 1161
thread 02: 1112
thread 03: 1112
thread 04: 55494
--------------------
on xterm on my UP machine.  This is a unexpected result.  It seems to me 
that
libpthread does unfair scheduling.  But on SMP machine that program shows
expected result and on console too...


--------------------
Kazuaki Oda


--------------070804040805030500010306
Content-Type: text/plain;
 name="thrdtest.c"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="thrdtest.c"

#include <sys/types.h>
#include <sys/uio.h>
#include <err.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define NTHREADS	5
#define BUFSZ		128

void *func(void *arg);

typedef struct {
    int id;
} funcarg;

int stop = 0;
long counts[NTHREADS];

int main(void)
{
    pthread_t tids[NTHREADS];
    funcarg *arg;
    int rval;
    int i;

    for (i = 0; i < NTHREADS; i++) {
	if ((arg = malloc(sizeof(funcarg))) == NULL)
	    err(1, "malloc");
	arg->id = i;
	if ((rval = pthread_create(&tids[i], NULL, func, arg)) != 0)
	    errc(1, rval, "pthread_create");
    }

    sleep(10);

    stop = 1;

    for (i = 0; i < NTHREADS; i++) {
	if ((rval = pthread_join(tids[i], NULL)) != 0)
	    errc(1, rval, "pthread_join");
    }

    printf("--------------------\n");
    for (i = 0; i < NTHREADS; i++)
	printf("thread %02d: %ld\n", i, counts[i]);
    printf("--------------------\n");

    return 0;
}

void *func(void *arg)
{
    char buf[BUFSZ];
    int id;
    int n;

    id = ((funcarg *)arg)->id;
    free(arg);

    while (!stop) {
	counts[id]++;
	n = snprintf(buf, sizeof(buf), "thread %02d: countup\n", id);
	write(STDOUT_FILENO, buf, n);
    }

    return NULL;
}

--------------070804040805030500010306--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?42173C82.7040408>