ref: a1c8da91f18c8bd3cdc7ce36c70538969e0c5602
dir: /lock.c/
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#include "bench.h"
#define NLockIters 1
pthread_mutex_t l = PTHREAD_MUTEX_INITIALIZER;
static int count;
void
nop(void)
{
}
void
work(void)
{
int i;
for(i = 0; i < 100*1000; i++)
count++;
}
void
dolock(void (*work)(void), int n)
{
int i;
for(i = 0; i < n; i++){
pthread_mutex_lock(&l);
work();
pthread_mutex_unlock(&l);
}
}
struct thread_data {
void (*fn)(void(*)(void), int);
void (*work)(void);
int ninc;
sem_t *start_sem;
};
static void *
thread_worker(void *arg)
{
struct thread_data *td = arg;
sem_wait(td->start_sem);
td->fn(td->work, td->ninc);
return NULL;
}
void
lockbench(void (*fn)(void(*)(void), int), int nthr, void (*work)(void), int ninc)
{
pthread_t *threads;
struct thread_data td;
sem_t start_sem;
int i;
threads = malloc(nthr * sizeof(pthread_t));
sem_init(&start_sem, 0, 0);
td.fn = fn;
td.work = work;
td.ninc = ninc;
td.start_sem = &start_sem;
for(i = 0; i < nthr; i++){
if(pthread_create(&threads[i], NULL, thread_worker, &td) != 0) {
fprintf(stderr, "pthread_create failed\n");
exit(1);
}
}
for(i = 0; i < nthr; i++)
sem_post(&start_sem);
for(i = 0; i < nthr; i++)
pthread_join(threads[i], NULL);
sem_destroy(&start_sem);
free(threads);
}
void benchlock1(B *b) { lockbench(dolock, 1, nop, b->N); }
void benchlock4(B *b) { lockbench(dolock, 4, nop, b->N); }
void benchlock16(B *b) { lockbench(dolock, 16, nop, b->N); }
void benchlock64(B *b) { lockbench(dolock, 64, nop, b->N); }
void benchlock512(B *b) { lockbench(dolock, 512, nop, b->N); }
void benchlock1_w(B *b) { lockbench(dolock, 1, work, b->N); }
void benchlock4_w(B *b) { lockbench(dolock, 4, work, b->N); }
void benchlock16_w(B *b) { lockbench(dolock, 16, work, b->N); }
void benchlock64_w(B *b) { lockbench(dolock, 64, work, b->N); }
void benchlock512_w(B *b) { lockbench(dolock, 512, work, b->N); }
int
main(int argc, char **argv)
{
benchinit(argc, argv);
printf("== locking (fast work) ==\n");
BM(benchlock1);
BM(benchlock4);
BM(benchlock16);
BM(benchlock64);
BM(benchlock512);
printf("== locking (slow work) ==\n");
BM(benchlock1_w);
BM(benchlock4_w);
BM(benchlock16_w);
BM(benchlock64_w);
BM(benchlock512_w);
return 0;
}