#include #include #include #include #include #include #define MAX_THREADS 256 static char *mapping; static void *masher(void *v) { int id = (int)v; unsigned offset = id * getpagesize(); printf("started thread %d\n", id); for(;;) { mprotect(mapping+offset, getpagesize(), PROT_READ); mprotect(mapping+offset, getpagesize(), PROT_READ | PROT_WRITE); } return NULL; } int main(int argc, char **argv) { int i; int nthreads = 4; pthread_t threads[MAX_THREADS]; if (argc == 2) { int t = atoi(argv[1]); if (t != 0) nthreads = t; } if (nthreads > MAX_THREADS) nthreads = MAX_THREADS; printf("creating %d threads...\n", nthreads); mapping = mmap(0, getpagesize() * nthreads, PROT_NONE, MAP_POPULATE|MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); if (mapping == (char *)-1) { perror("mmap failed"); return 1; } for(i = 0; i < nthreads; i++) { int ret; ret = pthread_create(&threads[i], NULL, masher, (void *)i); if (ret) { printf("pthread create %d failed: %s\n", i, strerror(ret)); return 1; } } for(i = 0; i < nthreads; i++) { void *ret; pthread_join(threads[i], &ret); } return 0; }