thread accounting in libpthread
Kazuaki Oda
kaakun at highway.ne.jp
Sat Feb 19 05:18:31 PST 2005
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
-------------- next part --------------
#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;
}
More information about the freebsd-threads
mailing list