schedbench

上级 25fa822b
......@@ -37,7 +37,7 @@ UPROGS= \
wqtest \
rm \
avar \
futexbench
schedbench
ifeq ($(HAVE_LWIP),y)
UPROGS += \
......
......@@ -4,47 +4,68 @@
#include "pthread.h"
#include "futex.h"
#include "errno.h"
#include "atomic.hh"
static volatile std::atomic<u64> waiting;
static volatile u64 ftx;
static int iters;
static int nworkers;
static void*
worker(void *arg)
static
void* worker(void* x)
{
long r;
for (int i = 0; i < iters; i++) {
r = futex((u64*)&ftx, FUTEX_WAIT, 0, 0);
++waiting;
r = futex((u64*)&ftx, FUTEX_WAIT, (u64)i, 0);
if (r < 0 && r != -EWOULDBLOCK)
die("FUTEX_WAIT: %d", r);
ftx = 0;
r = futex((u64*)&ftx, FUTEX_WAKE, 1, 0);
}
return nullptr;
}
static
void master(void)
{
long r;
for (int i = 0; i < iters; i++) {
while (waiting.load() < nworkers)
nop_pause();
waiting.store(0);
ftx = i+1;
r = futex((u64*)&ftx, FUTEX_WAKE, nworkers, 0);
assert(r == 0);
}
}
int
main(int ac, char** av)
{
pthread_t th;
long r;
if (ac < 2)
die("usage: %s iters", av[0]);
if (ac < 3)
die("usage: %s iters nworkers", av[0]);
iters = atoi(av[1]);
nworkers = atoi(av[2]);
waiting.store(0);
pthread_create(&th, 0, &worker, 0);
for (int i = 0; i < iters; i++) {
ftx = 1;
r = futex((u64*)&ftx, FUTEX_WAKE, 1, 0);
assert(r == 0);
r = futex((u64*)&ftx, FUTEX_WAIT, 1, 0);
if (r < 0 && r != -EWOULDBLOCK)
die("FUTEX_WAIT: %d", r);
for (int i = 0; i < nworkers; i++) {
pthread_t th;
r = pthread_create(&th, nullptr, worker, nullptr);
if (r < 0)
die("pthread_create");
}
nsleep(1000*1000);
wait();
printf("done\n");
return 0;
u64 t0 = rdtsc();
master();
u64 t1 = rdtsc();
printf("%lu\n", (t1-t0)/iters);
for (int i = 0; i < nworkers; i++)
wait();
}
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论